[英]How to get an object from a MongoDB nested array
我有一個 MongoDB 集合,用於存儲聊天對象,其中消息嵌入為嵌套數組。 整個集合如下所示:
chats = [
{
_id: 0,
messages: [
{
_id: 0,
text: 'First message'
},
{
_id: 1,
text: 'Second message'
}
]
},
{
_id: 1,
messages: []
}
]
我想更新一條消息並將其返回給用戶。 我可以像這樣更新消息(在節點中):
const chat = chats.findOneAndUpdate({
_id: ObjectId(chatID),
"messages._id": ObjectId(messageID)
}, {
$set: {
"messages.$.text": newText
}
});
問題是這個查詢更新了一條消息並返回了一個聊天object,這意味着我必須再次在我的代碼中查找更新的消息。 (即chat.messages.find(message => message._id === messageID)
)。
有沒有辦法直接從 MongoDB 獲取消息object ? 在同一個查詢中進行更新也會很好。
編輯:我正在使用帶有 mongodb 的節點。
謝謝!
由於 MongoDB 方法findOneAndUpdate
, findAndModify
不允許從數組字段中獲取更新的文檔,
$
返回數組的更新子文檔returnNewDocument: true
將返回更新(新)文檔,但這將返回整個文檔 object問題是,MongoDB 不能允許使用位置投影並同時返回新文檔
對於臨時解決方案,請嘗試使用投影,這將使用$
位置從數組字段返回原始文檔,
const chat = chats.findOneAndUpdate(
{
_id: ObjectId(chatID),
"messages._id": ObjectId(messageID)
},
{ $set: { "messages.$.text": newText } },
{
projection: { "messages.$": 1 }
}
);
結果:
{
"_id" : 0.0,
"messages" : [
{
"_id" : 0.0,
"text" : "Original Message"
}
]
}
要獲取更新的文檔,可以像這樣進行新查詢:
const message = chats.findOne({
_id: ObjectId(chatID),
"messages._id": ObjectId(messageID)
}, {
projection: {'messages.$': 1},
}).messages[0];
結果:
{
"_id": 0.0,
"text": "New message",
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.