【问题标题】:MongoDB - How to merge output from unwind如何合并 unwind mongodb 的输出?
【发布时间】:2022-01-21 11:45:41
【问题描述】:

例如,我在这样的集合中有数据:

db.inventory2.insertMany([
  { "_id" : 1, "item" : "ABC", price: NumberDecimal("80"), "sizes": [ "S", "M", "L"] },
  { "_id" : 2, "item" : "EFG", price: NumberDecimal("120"), "sizes" : [ ] },
  { "_id" : 3, "item" : "IJK", price: NumberDecimal("160"), "sizes": ["M"] },
])

并且,在添加 $unwind 时,我想选择 size 不为 null 的项目。

我添加 $unwind 后的结果:

db.inventory2.aggregate( [ { $unwind: { path: "$sizes" } } ] )
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "S" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "M" }
{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : "L" }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : "M" }

我的问题是,当我添加 $unwind 时,如何不分隔结果项“ABC”。我的预期结果是这样的:

{ "_id" : 1, "item" : "ABC", "price" : NumberDecimal("80"), "sizes" : ["S", "M", "L"] }
{ "_id" : 3, "item" : "IJK", "price" : NumberDecimal("160"), "sizes" : ["M"] }

感谢您的帮助。

【问题讨论】:

    标签: node.js mongodb aggregation-framework


    【解决方案1】:

    根据我从您的问题中了解到的情况,您正在尝试使用 sizes 过滤文档不是一个空数组。

    您不需要$unwind 舞台,而是需要$match 舞台。

    db.collection.aggregate([
      {
        $match: {
          sizes: {
            $ne: []
          }
        }
      }
    ])
    

    Sample Mongo Playground 1


    或者

    db.collection.aggregate([
      {
        $match: {
          $expr: {
            $ne: [
              {
                "$size": "$sizes"
              },
              0
            ]
          }
        }
      }
    ])
    

    Sample Mongo Playground 2

    【讨论】:

      【解决方案2】:

      用这个代替 $unwind 怎么样:

      db.inventory2.aggregate([
        {
            $addFields : {
                "sizeCount" : {$size: "$sizes"}
            }
        },
        {$match: {"sizeCount" : {$gt: 0}}},
        {$project: {"sizeCount" : 0}}
      ])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        • 2014-09-27
        • 2020-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多