Mongodb 将现有字段添加到嵌套架构

Mongodb 将现有字段添加到嵌套架构,mongodb,mongodb-query,Mongodb,Mongodb Query,我的数据库中有具有架构的文档: var MySchema = new Schema({ Street: { type: String }, Age: { type: Number, default: null }, Date: { type: Date }, Stuff: [ { _id:false, ThisDate: { type: Date }, ThisStreet: { type: String }

我的数据库中有具有架构的文档:

var MySchema = new Schema({
  Street: { type: String },
  Age: { type: Number, default: null },
  Date: { type: Date },
  Stuff: [
       {
        _id:false, 
        ThisDate: { type: Date },
        ThisStreet: { type: String }
       }]
});
现在它是(
Stuff
为空):

然后我想更新所有文档。我要做的是将
Street
Date
字段移动到
Stuff
数组中,并从模式中删除
Street
Date
字段

像这样:

db.person.findOne()  
    {
      Age: 23,
      Stuff : [ 
      {
        ThisDate : ISODate("2016-02-19T00:00:00.000Z"),
        ThisStreet : "TheStreet"
      }
      ]
    }
我怎样才能做到这一点? 最好的祝愿

由于这是一个“一次性”操作,我将在shell中完成它,而不是使用任何其他框架

对于MongoDB 3.2.x版本和更高版本的使用:

var-ops=[];
db.person.find({
“Street”:{“$exists”:true},
“日期”:{“$exists”:true}
}).forEach(功能(文档){
推({
“updateOne”:{
“筛选器”:{“\u id”:doc.\u id},
“更新”:{
“$unset”:{
“街道”:“,
“日期”:”
},
“$set”:{
“东西”:[{
“ThisDate”:文件日期,
“这条街”:博士街
}]
}
}
}
});
如果(运算长度==1000){
db.person.bulkWrite(ops);
ops=[];
}
})
如果(操作长度>0)
db.person.bulkWrite(ops);
或对于MongoDB 2.6.x和3.0.x版本,使用此版本的批量操作:

var bulk=db.person.initializeUnderedBulkop(),
计数=0;
db.person.find({
“Street”:{“$exists”:true},
“日期”:{“$exists”:true}
}).forEach(功能(文档){
bulk.find({“\u id”:doc.\u id}).updateOne({
“$unset”:{
“街道”:“,
“日期”:”
},
“$set”:{
“东西”:[{
“ThisDate”:文件日期,
“这条街”:博士街
}]
}
});
如果(计数%1000==0){
bulk.execute();
bulk=db.person.initializeUnderedBulkop();
}
});
如果(计数%1000!=0)
bulk.execute();
归根结底,您需要迭代集合中的文档,并使用“一个接一个”重新排列的内容将它们写回。至少在这两种情况下使用的Bulk operations API会将编写和响应服务器的负载减少到要处理的集合中每1000个文档中只有一个文档

另外,不要重写整个文档,而是使用它来删除所需的字段并“仅”写入所需的数据


工作示例
db.person.insert(
{
“街道”:“TheStreet”,
“年龄”:23岁,
“日期”:ISODate(“2016-02-19T00:00:00.000Z”),
“材料”:[]
}
)
然后在运行上述任一pdate后,结果为:

{
“_id”:ObjectId(“56e607c1ca8e7e3519b4ce93”),
“年龄”:23岁,
“东西”:[
{
“此日期”:ISODate(“2016-02-19T00:00:00Z”),
“这条街”:“TheStreet”
}
]
}

我建议您使用聚合框架转换文档,并按照下面的代码片段进行更新

db.person.aggregate([
{$project:{Age:1, Stuff:[{Date:"$Date", Street:"$Street"}]}}
]).forEach(function(o){
  var id = o._id;
  delete o._id;
  db.person.update({_id:id, Street:{$exists: true}},o);
});
成功执行后,您的文档应该如下所示

{ 
    "_id" : ObjectId("56e2cd45792861e14df1f0a9"), 
    "Age" : 23.0, 
    "Stuff" : [
        {
            "Date" : ISODate("2016-02-19T00:00:00.000+0000"), 
            "Street" : "TheStreet"
        }
    ]
}

用示例文档更新您的帖子。另外,更新所有文档是什么意思?您的意思是要将street和date字段移动到数组中吗?@Saleem第一个
db.person.findOne()
是示例文档。是的,将街道和日期移动到Stuff数组中。太好了。请看下面我的帖子。我正在使用聚合框架转换文档。@user1665355第二个清单涵盖了2.6.x和3.0.x版本<代码>bulkWrite()是在3.2中引入的。我会试试看!:)谢谢我一看到它工作就接受!是否可以在mongodb shell中使用
replace
javascript命令?正在尝试,但不起作用。@user1665355只需按此处的方式运行列表。这样做是有原因的,主要是因为它是最有效和安全的方式。它似乎有效,但我得到:
2016-03-13T11:18:56.577+0100 E QUERY SyntaxError:Unexpected end of input>bulk.execute()在shell中。你知道为什么吗?
{ 
    "_id" : ObjectId("56e2cd45792861e14df1f0a9"), 
    "Age" : 23.0, 
    "Stuff" : [
        {
            "Date" : ISODate("2016-02-19T00:00:00.000+0000"), 
            "Street" : "TheStreet"
        }
    ]
}