我有一个“用户”集合如下:
{
_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不适用于嵌套数组。我想知道它是否可以使用查询而不是脚本
答案 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();