在mongoDB中使用新密钥更新对象数组

在mongoDB中使用新密钥更新对象数组,mongodb,insert,updates,Mongodb,Insert,Updates,与此类似 通过查看数据集,我得到了类似的结果: { 'user_id':'{1231mjnD-32JIjn-3213}', 'name':'John', 'campaigns': [ { 'campaign_id':3221, 'start_date':'12-01-2012', }, {

与此类似

通过查看数据集,我得到了类似的结果:

{
    'user_id':'{1231mjnD-32JIjn-3213}',
    'name':'John',
    'campaigns':
        [
            {
                'campaign_id':3221,
                'start_date':'12-01-2012',
            },
            {
                'campaign_id':3222,
                'start_date':'13-01-2012',
            }
        ]
}
我想在
活动中添加一个新键,如下所示:

{
    'user_id':'{1231mjnD-32JIjn-3213}',
    'name':'John',
    'campaigns':
        [
            {
                'campaign_id':3221,
                'start_date':'12-01-2012',
                'worker_id': '00000'
            },
            {
                'campaign_id':3222,
                'start_date':'13-01-2012',
                'worker_id': '00000'
            }
        ]
}
如何将新密钥插入/更新到对象数组中?
我想向数组中的每个对象添加一个默认值为
00000
的新键

我试过:
db.test.update({},{$set:{'campaiments.worker_id':00000},true,true)

db.test.update({},{$set:{campaiments:{worker\u id:00000}},true,true)

有什么建议吗

db.test.update({}, {$set: {'campaigns.0.worker_id': 00000}}, true, true
这将更新0元素

如果要
在数组中的每个对象中添加一个新键
,应使用:
$unwind

例如:

{
  title : "this is my title" ,
  author : "bob" ,
  posted : new Date() ,
  pageViews : 5 ,
  tags : [ "fun" , "good" , "fun" ] ,
  comments : [
      { author :"joe" , text : "this is cool" } ,
      { author :"sam" , text : "this is bad" }
  ],
  other : { foo : 5 }
}
展开标签

db.article.aggregate(
    { $project : {
        author : 1 ,
        title : 1 ,
        tags : 1
    }},
    { $unwind : "$tags" }
);
结果:

{
     "result" : [
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "fun"
             },
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "good"
             },
             {
                     "_id" : ObjectId("4e6e4ef557b77501a49233f6"),
                     "title" : "this is my title",
                     "author" : "bob",
                     "tags" : "fun"
             }
     ],
     "OK" : 1
}

在您可以编写简单的升级查询之后。

我假设此操作将发生一次,因此您可以使用脚本来处理它:

var docs = db.test.find();
for(var i in docs) {
    var document = docs[i];

    for(var j in document.campaigns) {
        var campaign = document.campaigns[j];
        campaign.worker_id = '00000';
    }

    db.test.save(document);
}
脚本将遍历集合中的所有文档,然后遍历每个文档中的所有活动,并设置*worker\u id*属性。
最后,每个文档都被持久化。

我将代码放入一个名为
addTo.js
的文件中。然后在mongo shell中,我有
mongo addTo.js
。错误如下:
InternalError:src/mongo/shell/collection.js:131递归太多。这是正确的方法吗?你在这个收藏中有多少文件?也许您应该多次运行脚本,使用skip and limit函数来避免此错误。添加新密钥必须通过脚本而不是mongo shell来完成?如果您可以通过mongo shell来完成,这意味着您可以通过每个mongo驱动程序来使用它。您可以通过mongo shell来完成吗?据我所知,
aggregate
不修改数据库,而是输出请求的文档。我想修改实际的数据库。这只是个例子。我想给你一个解决问题的机会。我理解并感谢您,但我正在寻找通过mongo shell修改文档的内容。我确信这个问题可以通过脚本解决,但我想直接使用mongo shell。