Updating an array of objects with a new key in mongoDB

流过昼夜 提交于 2019-12-23 18:13:17

问题


Similar to this question

Barrowing the data set, I have something similar to this:

{
    'user_id':'{1231mjnD-32JIjn-3213}',
    'name':'John',
    'campaigns':
        [
            {
                'campaign_id':3221,
                'start_date':'12-01-2012',
            },
            {
                'campaign_id':3222,
                'start_date':'13-01-2012',
            }
        ]
}

And I want to add a new key in the campaigns like so:

{
    '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'
            }
        ]
}

How to insert/update a new key into an array of objects?
I want to add a new key into every object inside the array with a default value of 00000.

I have tried:
db.test.update({}, {$set: {'campaigns.worker_id': 00000}}, true, true)
db.test.update({}, {$set: {campaigns: {worker_id': 00000}}}, true, true)

Any suggestions?


回答1:


I'm supposing that this operation will occur once, so you can use a script to handle it:

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);
}

The script will iterate over all documents in your collection then over all campaigns in each document, setting the *worker_id* property. At the end, each document is persisted.




回答2:


db.test.update({}, {$set: {'campaigns.0.worker_id': 00000}}, true, true

this will update 0 element.

if you want to add a new key into every object inside the array you should use: $unwind

example:

{
  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 }
}

unwinding tags

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

result:

{
     "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
}

After you could write simple updaiting query.



来源:https://stackoverflow.com/questions/13980253/updating-an-array-of-objects-with-a-new-key-in-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!