Mongoose 聚合查询以从 ref 集合中过滤值
Mongoose aggregate query to filter value from the ref collection
我有 2 个合集如下:
事件
{
"_id" : ObjectId("61f272dd1fac703fec69105a"),
"eventActivity" : [
ObjectId("61f76703196ea94bd43fa92e"),
]
}
事件-activity
{
"_id" : ObjectId("61f76703196ea94bd43fa92e"),
"activity" : ObjectId("61f2a69bfe99e07db083de50"),
}
基于上面的集合,event 有 eventActivity
字段引用 event-activity 集合.我正在尝试按 event-activity.activity
.
的值过滤事件
因此,例如,如果我的过滤选择在数组 ['61d6b2060d6fe32d9853ad40', '61f2a69bfe99e07db083de50']
中有 activity,它将 return 事件。如果过滤选择有 activity id ['61d6b2060d6fe32d9853ad40']
,它不应该 return 任何事件,因为没有来自 event-[= 的 activity id 的事件45=]
我不太明白聚合查找是如何工作的,但我试过了,但它不起作用。
event.aggregate([
{"$lookup":{
"from":"event-activity",
"localField":"activity",
"foreignField":"_id",
"as":"event-activity"
}},
{
"$match":{
"event-activity.activity":{
"$in":["61d6b2060d6fe32d9853ad40","61f2a69bfe99e07db083de50"]
}
}
}
])
我参考了manual here
或者 find()
可以代替吗?
查询
- 您可以使用管道查找并将匹配项放入其中
- 如果查找结果为空,您可以根据需要删除或保留文档,像这样
{"$match":{"$expr":{"$ne":["$activities", []]}}}
event.aggregate(
[{"$lookup":
{"from":"event-activity",
"localField":"eventActivity",
"foreignField":"_id",
"pipeline":
[{"$match":
{"activity":
{"$in":
[ObjectId("61d6b2060d6fe32d9853ad40"),
ObjectId("61f2a69bfe99e07db083de50")]}}}],
"as":"activities"}}])
如果我没理解错你可以使用这个聚合查询:
此查询使用 $lookup
和 pipeline
,其中结果由与 $in
的匹配给出。因此,连接将 return event-activity.activity
在数组 event.eventActivity
.
中的值
db.event.aggregate([
{
"$lookup": {
"from": "event-activity",
"as": "activities",
"let": {
"ea": "$eventActivity"
},
"pipeline": [
{
"$match": {
"$expr": {
"$in": [
"$activity",
"$$ea"
]
}
}
}
]
}
}
])
示例 here 我将整数用作 activity
以便更轻松地查看连接。
我有 2 个合集如下:
事件
{
"_id" : ObjectId("61f272dd1fac703fec69105a"),
"eventActivity" : [
ObjectId("61f76703196ea94bd43fa92e"),
]
}
事件-activity
{
"_id" : ObjectId("61f76703196ea94bd43fa92e"),
"activity" : ObjectId("61f2a69bfe99e07db083de50"),
}
基于上面的集合,event 有 eventActivity
字段引用 event-activity 集合.我正在尝试按 event-activity.activity
.
因此,例如,如果我的过滤选择在数组 ['61d6b2060d6fe32d9853ad40', '61f2a69bfe99e07db083de50']
中有 activity,它将 return 事件。如果过滤选择有 activity id ['61d6b2060d6fe32d9853ad40']
,它不应该 return 任何事件,因为没有来自 event-[= 的 activity id 的事件45=]
我不太明白聚合查找是如何工作的,但我试过了,但它不起作用。
event.aggregate([
{"$lookup":{
"from":"event-activity",
"localField":"activity",
"foreignField":"_id",
"as":"event-activity"
}},
{
"$match":{
"event-activity.activity":{
"$in":["61d6b2060d6fe32d9853ad40","61f2a69bfe99e07db083de50"]
}
}
}
])
我参考了manual here
或者 find()
可以代替吗?
查询
- 您可以使用管道查找并将匹配项放入其中
- 如果查找结果为空,您可以根据需要删除或保留文档,像这样
{"$match":{"$expr":{"$ne":["$activities", []]}}}
event.aggregate(
[{"$lookup":
{"from":"event-activity",
"localField":"eventActivity",
"foreignField":"_id",
"pipeline":
[{"$match":
{"activity":
{"$in":
[ObjectId("61d6b2060d6fe32d9853ad40"),
ObjectId("61f2a69bfe99e07db083de50")]}}}],
"as":"activities"}}])
如果我没理解错你可以使用这个聚合查询:
此查询使用 $lookup
和 pipeline
,其中结果由与 $in
的匹配给出。因此,连接将 return event-activity.activity
在数组 event.eventActivity
.
db.event.aggregate([
{
"$lookup": {
"from": "event-activity",
"as": "activities",
"let": {
"ea": "$eventActivity"
},
"pipeline": [
{
"$match": {
"$expr": {
"$in": [
"$activity",
"$$ea"
]
}
}
}
]
}
}
])
示例 here 我将整数用作 activity
以便更轻松地查看连接。