簡體   English   中英

如何從 MongoDB 嵌套數組中獲取 object

[英]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 方法findOneAndUpdatefindAndModify不允許從數組字段中獲取更新的文檔,

  • 投影將在數組字段名稱之后使用位置$返回數組的更新子文檔
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM