[英]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.