$ unset不能处理对象数组?

时间:2014-10-13 20:59:24

标签: mongodb

我有一个包含以下文档的集合:

{
   title: "whatever",
   answers: [
      {id: 10, question: ObjectId("54380350a52147000aad4e9b")},
      {id: 13, question: ObjectId("54380350a52147000aad4e9c")},
      {id: 33}
   ]
}

我尝试使用以下命令取消设置question属性:

db.participants.update({}, {$unset: {"answers.question": ""}}, {upsert: false, multi:true} )

db.participants.update({}, {$unset: {"answers.question": 1}}, {upsert: false, multi:true} )

这两个都在完成时吐出:WriteResult({ "nMatched" : 628795, "nUpserted" : 0, "nModified" : 0 }),但没有更新文档(如消息所示)。知道为什么我的更新不起作用吗?

1 个答案:

答案 0 :(得分:2)

您的更新无效,因为answers是一个数组。所以你应该使用位置运算符:

db.participants.update({ 'answers.question': { $exists: true } }, { $unset: { 'answers.$.question': '' } }, { upsert: false, multi: true });

但是它只更新数组中的一个项目。这是MongoDB的限制,请参阅SERVER-1243

您可以使用forEach遍历数组的项目:

db.eval(function () {

    db.participants.find({ 'answers.question': { $exists: true } }).forEach(function (participant) {

        participant.answers.forEach(function (answer) {

            delete answer.question;
        });

        db.participants.update({ _id: participant._id }, { $set: { answers: participant.answers } });
    });
});