重命名mongodb中的嵌套键

时间:2016-08-22 20:14:33

标签: mongodb mongodb-query

我有一个“用户”集合如下:

{
_id: "123",
"address": {
  "contact1":{
       "cell":"98765412345"
   },
  "contact2":{
       "cell":"98765412346"
   }
 }
}

我想在所有嵌套对象contact1,contact2等中将字段'cell'重命名为'mobile'。

以下查询有效:

db.user.update({},{$rename:{'address.contact1.cell':'address.contact1.mobile'}})

理想情况下,我希望更新所有嵌套对象。所以我试过

db.user.update({},{$rename:{'address.$.cell':'address.$.mobile'}})

这不起作用。我搜索了类似的问题,所有这些问题都有嵌套数组而不是映射(在我的例子中),我得到的答案是$ rename不适用于嵌套数组。我想知道它是否可以使用查询而不是脚本

2 个答案:

答案 0 :(得分:1)

db.testuser.update({},{$rename:{'address.contact1.cell':'address.contact1.mobile'}}, false, true);

false用于upsert:false,true用于multi:true。您需要multi:true来更新所有记录。然后你必须手动完成每个不同的键。这会将contact1对象下的所有单元格更新为mobile而不是contact2对象下的单元格。否则你必须编写一些脚本。

答案 1 :(得分:0)

    { 
        "_id" : ObjectId("5c6f515bb910a41707811f56"), 
        "securityQuestions" : [
            {
                "sequenceNo" : "2", 
                "enabled" : "Y", 
                "questionText" : "what is your role?", 
                "questionNo" : "2"
            }, 
            {
                "sequenceNo" : "3", 
                "enabled" : "Y", 
                "questionText" : "what is your profile-dept ?", 
                "questionNo" : "3"
            }
        ]
    }

尝试了一些我必须设置和取消设置的密钥后,我遇到了类似的问题。我正在将问题号替换为问题号。请参考以下解决方案

    var bulk = db.collectionName.initializeOrderedBulkOp(),
    count = 0;

    db.collectionName.find({ "securityQuestions.questionNo": { "$exists": true } }).forEach(function(doc) {
        doc.securityQuestions.forEach(function(securityQuestions) {
            if ( securityQuestions.hasOwnProperty("questionNo") ) { 
                bulk.find({ "_id": doc._id, "securityQuestions.sequenceNo": securityQuestions.sequenceNo }).updateOne({
                    "$set": { "securityQuestions.$.questionId": securityQuestions.questionNo }
                });
                bulk.find({ "_id": doc._id, "securityQuestions.sequenceNo": securityQuestions.sequenceNo }).updateOne({
                    "$unset": { "securityQuestions.$.questionNo": 1 }
                });
                count += 2;

                if ( count % 500 == 0 ) {
                    bulk.execute();
                    bulk = db.collectionName.initializeOrderedBulkOp();
                }
            }
        });
    });

    if ( count % 500 !== 0 ) 
        bulk.execute();