$lookup 聚合中的 $project [重复]
Posted
技术标签:
【中文标题】$lookup 聚合中的 $project [重复]【英文标题】:$project in $lookup aggregation [duplicate] 【发布时间】:2019-01-29 07:18:07 【问题描述】:所以我有以下文件
"_id": "5b7dfee3130dd4ff45288882",
"name": "test",
...
"list":
"_id": "5b7dfee2130dd4ff45288875",
"name": "test"
...
鉴于list
是通过lookup
+ unwind
创建的,我应该如何投影所有主文档的字段,而只投影list
的_id
和name
,即
"$match": match
,
"$lookup":
from: "lists",
localField: "list",
foreignField: "_id",
as: "list"
,
"$unwind": "$list"
,
【问题讨论】:
【参考方案1】:主要挑战是您希望主文档中的所有字段(因为您不知道所有字段)加上列表中的 2 个。
应该这样做:
$project:
"_id": 0,
"document": "$$CURRENT",
"list._id": "$$CURRENT.list._id",
"list.name": "$$CURRENT.list.name"
,
$project:
"document.list": 0
,
$addFields:
"document.list._id": "$$CURRENT.list._id",
"document.list.name": "$$CURRENT.list.name"
,
$replaceRoot:
newRoot: "$document"
它经历了几个阶段,但完成了工作:)。它将获取当前文档,并且只获取您想要的列表字段。然后它将从当前文档中删除其列表。然后它将列表添加到同一个文档中(因为该列表包含我们想要的特定字段)。然后它将这些字段添加到文档中,最后它将根替换为该文档。
See it here working.
【讨论】:
唯一的问题是,主文档可能有很多字段(一些未知),而我确切地知道我想要的列表字段。 IE。list.id
和 list.name
用另一个选项更新了我的答案
这看起来很酷,unwind
可以让它再次成为一个对象吗?
不是真的,因为unwind
与数组一起工作,而document
是一个对象。
我想我明白了...查看更新的答案【参考方案2】:
这对于 mongodb 3.6 版 $lookup
聚合非常简单,您可以在 pipeline
中使用 $project
db.collection.aggregate([
"$lookup":
"from": "lists",
"let": "list": "$list" ,
"pipeline": [
"$match": "$expr": "$eq": [ "$_id", "list" ] ,
"$project": "name": 1
],
"as": "list"
,
"$unwind": "$list"
])
【讨论】:
以上是关于$lookup 聚合中的 $project [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Mongodb聚合$lookup $project和$match不起作用[重复]
MongoDB 聚合中的多个 $project 阶段是不是会影响性能