mongodb 在mongo 3.6中迁移到新的文档结构

5lhxktic  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(99)

我必须将数据从

{
    "_id": "some-id",
    "_class": "org.some.class",
    "number": 1015,
    "timestamp": {"$date": "2020-09-05T12:08:02.809Z"},
    "cost": 0.9200000166893005
  }

{"_id": {
  "productId": "some-id",
  "countryCode": "DE"
},
"_class": "org.some.class",
"number": 1015,
"timestamp": {"$date": "2020-09-05T12:08:02.809Z"},
"cost": 0.9200000166893005
}

新文档中的更改是_id字段替换为complex _id对象(productId:字符串,国家:字符串)。
国家/地区字段将为整个集合填写一个特定值- DE。
这个集合中有大约4000万条旧格式的记录和70万条新格式的记录。我想把这4000万条记录放到这个新的格式中。我使用的是mongo 3.6,所以我的功能有点有限,我可能需要使用聚合函数来创建一个全新的集合,然后删除旧的集合。
我将非常感谢帮助如何做到这一点-如何查询,将这样做应该看起来像和如何保持这些迁移700 k文档。
目前为止,我所得到的是:

db.productDetails.aggregate(
{$match: {_id: {$exists: true}}},
{$addFields: {"_id": {"productId": "$_id", "country": "DE"}},
{$project: {_id: 1, _class: 1, number: 1, timestamp: 1, cost: 1}},
{$out: "productDetailsV2"}
)

但只有在新表单中没有700 k个文档的情况下,此解决方案才有效。

sgtfey8w

sgtfey8w1#

您的查询方向正确。您可能需要稍微修改$match筛选器,以更好地捕获旧类型文档。

db.collection.aggregate([
  {
    $match: {
      "_id.country": {
        $exists: false
      }
    }
  },
  {
    $addFields: {
      "_id": {
        "productId": "$_id",
        "country": "DE"
      }
    }
  },
  {
    $project: {
      "_id": 1,
      "_class": 1,
      "number": 1,
      "timestamp": 1,
      "cost": 1
    }
  },
  {
    $out: "productDetailsV2"
  }
])

Mongo Playground

相关问题