簡體   English   中英

mongodb 從 id 數組中過濾文檔

[英]mongodb filter documents from an array of ids

我在 MongoDB 中有一個集合,看起來像這樣

 { "_id": ObjectId("62a2ef1084020f45678c8740"), "content_id": 436629, "isLocked": true, "type": "video", "created_at": ISODate("2022-06-10T12:43:20.563+05:30"), "updated_at": ISODate("2022-06-10T12:43:20.563+05:30"), "__v": 0 }

假設有數千個。 現在我有一個來自 diff api 的content_id數組

 [{ "content_id": 123456 }, { "content_id": 456789 }, { "content_id": 453211 }....]

我想檢查數組是否有一個 id 集合中存在一個 doc 並滿足條件"isLocked": false並根據它增加一個計數器。 一種解決方案是通過 for 或 map 循環數組並運行查找查詢以逐個檢查每個文檔,例如

 for (let i = 0; i < array.length; i++) { let result = await db.collection.find({ "content_id": array[i].content_id }); if (result && result.length > 0 && result[0].isLocked === false) { counter++; } }

這不是一個理想的解決方案,因為它會非常慢。 Mongodb 是否有一些東西可以在提高性能的同時達到相同的結果,或者我只剩下這個解決方案了?

使用$in怎么樣?

array = array.map(item => item.content_id) // becomes ["id1", "id2","id3"...]

然后使用以下查詢

let result = await db.collection.find({ "content_id": { $in: array }, isLocked : false })

如果您只想要結果文檔的總數,您可以只使用result.length或將.find替換為.countDocuments

要獲得更高的性能,請記住索引 content_id + isLocked

例如

db.collection.createIndex(
  { content_id: 1, isLocked: 1 } ,
  { name: "Content Id and isLocked" }
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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