$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_idname,即


    "$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.idlist.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 聚合管道限制 $lookup 字段

MongoDB 聚合中的多个 $project 阶段是不是会影响性能

Mongoose:$lookup 后的 $project 不显示字段

使用聚合 $lookup 加入 mongodb

使用 $unwind、$lookup 和 $group 的复杂聚合中的 mongodb 正确列表顺序