Mongodb通过提供id列表来查找嵌套数组中的多个对象



我有以下文档结构

{
_id: ..., 
topics: [ ... ], 
posts: [ {id: 1}, {id:2}, {id: 3}]
}

我想找到所有与特定ID匹配的帖子。E.g

[2,3]

我试过这个:

db.getCollection("data")
.find({},{
posts: {
$elemMatch: {
id: {
$in: [2, 3]
} 
}
}
})

但它只返回一个后

{
_id: ..., 
posts: [ {id: 3} ]
}

我想另一种方法是只返回所有帖子并手动过滤。哪一个会有更好的表现?

如果你想通过MongoDB来实现它,你必须通过聚合管道来实现,因为你想过滤posts数组,这是通过$filter操作符来完成的,正如@turivishal在评论中所建议的那样。试试这个:

db.collection.aggregate([
{
"$addFields": {
"posts": {
"$filter": {
"input": "$posts",
"as": "item",
"cond": {
"$in": [
"$$item.id",
[
1,
2
]
]
}
}
}
}
}
])

游乐场链接。

就性能而言,通常情况下,DB级别的过滤效果更好,因为运算符得到了尽可能多的优化,而且它还减少了传输的数据,因为所有不必要的内容都被过滤掉了。

最新更新