我有以下文档结构
{
_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级别的过滤效果更好,因为运算符得到了尽可能多的优化,而且它还减少了传输的数据,因为所有不必要的内容都被过滤掉了。