Mongodb使用输入数组聚合
Posted
技术标签:
【中文标题】Mongodb使用输入数组聚合【英文标题】:Mongodb aggregate by using input array 【发布时间】:2020-12-31 05:52:06 【问题描述】:我正在努力为我的 MongoDB 数据库创建聚合查询。
这是我的输入数组
recipients = [1,2,7]
这是我的数据库集合
"chapter": 1,
"targets": [
type: 'user',
recipient: 1
]
,
"chapter": 1,
"targets": [
type: 'user',
recipient: 2
]
,
"chapter": 2,
"targets": [
type: 'user',
recipient: 3
]
,
"chapter": 3,
"targets": [
type: 'user',
recipient: 4
]
,
想要的输出
should be [] because 7 doesn't exist in targets.recipient in the collection
这是我迄今为止尝试过的
db.collection.aggregate([
$match:
'targets.recipient': $in: recipients ,
,
])
任何建议,谢谢。
【问题讨论】:
嗨,您是否需要所有输入数组一次出现在文档中,例如。 [1,2,7]?如果 1,2 匹配,则查询将返回文档,因为存在 1,2 个元素。 【参考方案1】:$in 的工作方式是,如果文档的值与作为参数传递的数组之间存在任何匹配,它会返回文档。在您的情况下,您可以使用 $in
进行初始过滤,但是只有当结果集包含输入数组中的所有值时,您才希望返回结果。为了实现它,您可以使用$group 获取所有匹配结果,然后应用$all:
db.collection.aggregate([
$match: "targets.recipient": $in: [1,2,7]
,
$group:
_id: null,
docs: $push: "$$ROOT"
,
$match: "docs.targets.recipient": $all: [1,2,7]
])
Mongo Playground
【讨论】:
【参考方案2】:// only matched documents will be shown.
> db.targets.aggregate([ $match:"targets.recipient":$in:[1,2,7], $project:chapter:1,targets:1 ]).pretty();
"_id" : ObjectId("5f5de14c598d922a1e6eff4d"),
"chapter" : 1,
"targets" : [
"type" : "user",
"recipient" : 1
]
"_id" : ObjectId("5f5de14c598d922a1e6eff4e"),
"chapter" : 1,
"targets" : [
"type" : "user",
"recipient" : 2
]
>
【讨论】:
以上是关于Mongodb使用输入数组聚合的主要内容,如果未能解决你的问题,请参考以下文章