如何在MongoDB中更新数组元素

4
我在mongoDB中有以下数据:
{
  "_id": ObjectId("57c40e405e62b1f02c445ccc"),
  "sharedPersonId": ObjectId("570dec75cf30bf4c09679deb"),
  "notificationDetails": [
     {
       "userId": "57443657ee5b5ccc30c4e6f8",
       "userName": "Kevin",
       "isRed": true 
     } 
   ] 
}

现在我想将isRed的值更新为false,如何编写查询语句。我已经尝试了以下内容:
var updateIsRedField = function(db, callback) {
    db.collection('notifications').update({_id:notificationId},
    {
        $set: { "notificationDetails.$": {isRed: false}},
    }, function(err, results) {
        callback();
    });
};

MongoClient.connect(config.database, function(err, db) {
    assert.equal(null, err);
    updateIsRedField(db, function() {
        db.close();
    });
    return res.json({});
});

你在更新时遇到了任何错误吗?还是它没有更新? - Shrabanee
它没有更新。 - Kevin
你能检查一下 db.collection('notifications').find({_id:notificationId}) 的输出吗?它是否返回了任何记录? - Shrabanee
我之前更新了整个notificationDetails数组的isRed:false, 所以我现在得到了结果。 - Kevin
1个回答

3

由于位置占位符$操作符作为第一个匹配查询文档的元素的占位符,而且数组字段必须作为查询文档的一部分出现,因此查询{ "notificationDetails.isRed": true }对于正确使用$操作符至关重要:

db.collection('notifications').update(
    { "_id": notificationId, "notificationDetails.isRed": true },
    { "$set": { "notificationDetails.$.isRed": false } },
    function(err, results) {
        callback();
    }
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接