mongodb:将上一个管道结果的数组引用到下一个管道中

Posted

技术标签:

【中文标题】mongodb:将上一个管道结果的数组引用到下一个管道中【英文标题】:mongodb: Reference previous pipeline result's array into next pipeline 【发布时间】:2018-10-08 01:57:24 【问题描述】:

我正在使用聚合管道。

 const pipeline = [
                     $match: query  // first pipeline stage
 ]

这将给出以下结果:

"_id" : ObjectId("512bc95fe835e68f199c8686"), "author" : "dave", “得分”:80,“观看次数”:100

"_id" : ObjectId(“512bc962e835e68f199c8687”),“作者”:“戴夫”,“分数”:85, “浏览量”:521

我想将此管道结果(在本例中为数组)简化为一个对象。我知道,我们可以通过项目减少

第二个流水线阶段:


  $project: 
   results: 
    $reduce: 
        input: <array>, // We have $$ROOT, but I need previous pipeline result
        initialValue: <expression>,
        in: <expression>
    
   

我们如何将先前的管道结果作为数组引用到此管道阶段?

【问题讨论】:

一般只需要在reduce的输入栏输入$name_of_your_array即可。它将采用最后一个管道阶段的结果 显示您实际在做什么。你几乎可以肯定没有清楚地表达你需要在这里做什么。更容易 1. 显示一些源数据 2. 从该数据中显示所需的结果 3. 迄今为止您的尝试中使用的聚合管道。这是可以回答的。 如果问题不清楚,请告诉我。 【参考方案1】:

你必须使用 CURRENT


  $project: 
   results: 
    $reduce: 
        input: $$CURRENT, 
        initialValue: <expression>,
        in: <expression>
    
   

【讨论】:

docs.mongodb.com/manual/reference/aggregation-variables【参考方案2】:

你的意思是$group

db.collection.aggregate([
   "$match":  ...  ,  // your query conditions
   "$group":  
    "_id": "$author",
    "score":  "$sum": "$score" ,
    "views":  "$sum": "$views" 
  
])

这将“分组”"author" 字段,该字段位于 _id 中,并使用“累加器”返回其他属性,例如 $sum

 "_id" : "dave", "score" : 165, "views" : 621 

有关更多信息,我建议查看官方文档的 Aggregation 部分,其中显示了许多示例,如果您对 SQL 数据库有所了解,还可以查看 SQL to Aggregation Mapping Chart。

【讨论】:

以上是关于mongodb:将上一个管道结果的数组引用到下一个管道中的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

MongoDB 查找并映射 2 个结果数组

mongodb aggregate

如何将一个mongodb请求的结果同步传递到下一个请求的值?

MongoDB,分组,聚合

mongodb 分组聚合查询