我在处理与另一个集合的复杂匹配时遇到了一些困难,不太理解聚合管道的工作原理。目标是获取一个特定用户在分析集合中没有“video_impression”条目的视频列表。
我的数据大致如下:
我已经成功地让匹配器工作了,但它是以全局的方式工作的,也就是说它不考虑用户ID,所以它返回的文档与任何人都不匹配。
我尝试在管道中添加另一个
我的数据大致如下:
db={
"videos": [
{
"_id": "1",
"name": "1's Video",
"status": "complete",
"privacy": "public"
},
{
"_id": "2",
"name": "2's Video",
"status": "complete",
"privacy": "public"
},
{
"_id": "3",
"name": "3's Video",
"status": "complete",
"privacy": "public"
},
{
"_id": "4",
"name": "4's Video",
"status": "complete",
"privacy": "private"
},
{
"_id": "5",
"name": "5's Video",
"status": "flagged",
"privacy": "public"
}
],
"analytics": [
{
"_id": "1",
"user": "1",
"event": "video_impression",
"data": {
"video": "1"
}
},
{
"_id": "2",
"user": "2",
"event": "video_impression",
"data": {
"video": "2"
}
}
]
}
我已经成功地让匹配器工作了,但它是以全局的方式工作的,也就是说它不考虑用户ID,所以它返回的文档与任何人都不匹配。
db.videos.aggregate([
{
$match: {
"status": "complete",
"privacy": "public"
}
},
{
$lookup: {
from: "analytics",
localField: "_id",
foreignField: "data.video",
as: "matched_docs"
}
},
{
$match: {
"matched_docs": {
$eq: []
}
}
}
])
我尝试在管道中添加另一个
$lookup
阶段来查找user
字段,但似乎也没有起作用,因为数据始终为空。这里是我遇到的问题的Mongo Playground链接,可能会更好地解释。
analytics
文档都有一个"event": "video_impression"
。 - undefinedvideo_impression
事件记录,也就是说,指定用户没有对任何结果视频产生印象。 - undefined