MongoDB查找匹配的文档并更新对象数组内的匹配字段

时间:2020-08-21 16:07:29

标签: javascript database mongodb nosql

所以我有一个threads对象的文档结构,其中每个线程包含多个消息,还包含哪个用户已读取了哪个消息的数据:

线程集合:

{
    _id: ObjectId("5f1f0725850eca800c70ef9e"),
    thread_participants: [
      ObjectId("5f1efeece50f2b25d4be2de2"),
      ObjectId("5f1eff1ae50f2b25d4be2de4"),
    ],
    messages: [
      {
        id: ObjectId("5f1f0725850eca800c70ef98"),
        content: "Hello",
      },
      {
        id: ObjectId("5f1f0725850eca800c70ef92"),
        content: "Hey there!",
      },
    ],
    seen_status: [
        {
            user_id: "5f1efeece50f2b25d4be2de2",
            last_read_message_id: ObjectId("5f1f0725850eca800c70ef98")
        },
        {
            user_id: "5f1eff1ae50f2b25d4be2de4",
            last_read_message_id: null //User has not opened the conversation at all.
        }
    ],
    date_created: ISODate("2020-07-27T16:29:54.702Z"),
}
...
...
...
multiple threads

如何为user_id 5f1f0725850eca800c70ef9e更新线程5f1eff1ae50f2b25d4be2de4上特定user_id的last_read_message_id?

2 个答案:

答案 0 :(得分:1)

您可以使用$ positional operator

db.col.update({ _id: ObjectId("5f1f0725850eca800c70ef9e"), seen_status.user_id: "5f1eff1ae50f2b25d4be2de4" }, { $set: { 'seen_status.$.last_read_message_id': newValue } }

答案 1 :(得分:1)

使用arrayfilters和位置运算符$更新内部文档。

注意-这需要MongoDb 3.6 +

var filter = {
    _id: ObjectId('5f1f0725850eca800c70ef9e')
};

var update = {
    $set: {
        'seen_status.$[item].last_read_message_id': 5
    }
};

var options = {
    arrayFilters: [
        {
            'item.user_id' : ObjectId('5f1eff1ae50f2b25d4be2de4')
        }
    ]
};
db.collection.update(filter, update, options);