所以我有一个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?
答案 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);