复制并重命名MongoDB中的文档字段

复制并重命名MongoDB中的文档字段,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想重命名Mongo集合中所有文档都具有的字段。但是,我不想覆盖当前属性名,而是想将重命名后的属性保存为一个新字段,保留原始字段不变 想象一下,我的文档如下所示: { "property": "Original property value" } 我想得到这个: { "property": "Original property value", "property_new": "Original property value" } 我该怎么做呢?您可以使用聚合 db.collect

我想重命名Mongo集合中所有文档都具有的字段。但是,我不想覆盖当前属性名,而是想将重命名后的属性保存为一个新字段,保留原始字段不变

想象一下,我的文档如下所示:

{
  "property": "Original property value"
}
我想得到这个:

{
  "property": "Original property value",
  "property_new": "Original property value"
}
我该怎么做呢?

您可以使用聚合

db.collection.aggregate([
  { "$addFields": {
    "property_new": "$property"
  }},
  { "$out": "newCollection" }
])

它将创建一个名为
newCollection
的新集合,只需将其重命名为现有集合。

您只需在mongo shell上迭代集合元素并更新每个文档,即在
forEach
函数中添加新属性作为
property\u new
,如下所示:

db.st5.find().forEach(function(o) { db.st5.update({"_id":o._id}, {$set: {"property_new": o.property} } )})
> db.st5.find().forEach(function(o) { db.st5.update({"_id":o._id}, {$set: {"property_new": o.property} } )})
> db.st5.find()
{ "_id" : ObjectId("5c643368b913e399ee84b4f8"), "property" : "Original property value", "property_new" : "Original property value" }
> 
在更新之前,我已在集合
st5
中插入一份文档,如下所示:

> db.st5.insert({
...   "property": "Original property value"
... })
WriteResult({ "nInserted" : 1 })
> db.st5.find()
{ "_id" : ObjectId("5c643368b913e399ee84b4f8"), "property" : "Original property value" }
然后在每个元素上迭代并更新,如下所示:

db.st5.find().forEach(function(o) { db.st5.update({"_id":o._id}, {$set: {"property_new": o.property} } )})
> db.st5.find().forEach(function(o) { db.st5.update({"_id":o._id}, {$set: {"property_new": o.property} } )})
> db.st5.find()
{ "_id" : ObjectId("5c643368b913e399ee84b4f8"), "property" : "Original property value", "property_new" : "Original property value" }
> 
希望这能解决你的问题