【问题标题】:MongoDB merge two aggregations from different collectionsMongoDB 合并来自不同集合的两个聚合
【发布时间】:2020-09-07 09:48:35
【问题描述】:

我是后端和 MongoDB 的新手,如果我的问题听起来很愚蠢,请原谅我。

我有两个优惠产品集合,详情如下

产品

[
  {
    "name": "product #1",
    "place": "place ID"
  },
  {
    "name": "product #2",
    "place": "place ID"
  },
  {
    "name": "product #3",
    "place": "place ID"
  }
]

优惠

[
  {
    "name": "offer #1",
    "place": "place ID"
  },
  {
    "name": "offer #2",
    "place": "place ID"
  },
  {
    "name": "offer #3",
    "place": "place ID"
  }
]

所以我的目标是合并这两个集合的两个聚合并得到与这个相似的输出

[
  {
    "name": "offer #1",
    "place": "place ID",
    "type": "offer"
  },
  {
    "name": "product #1",
    "place": "place ID",
    "type": "product"
  },
  {
    "name": "offer #2",
    "place": "place ID",
    "type": "offer"
  },
  {
    "name": "offer #3",
    "place": "place ID",
    "type": "offer"
  },
  {
    "name": "product #2",
    "place": "place ID",
    "type": "product"
  },
  {
    "name": "product #3",
    "place": "place ID",
    "type": "product"
  }
]

我应该在产品上聚合并提供集合还是在地方聚合并对结果进行分组。

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    你可以试试,

    • $facet 将所有产品添加到数组中并添加类型字段
    • $lookup 有优惠
    • $project 在优惠$map 中添加类型字段,并使用$concatArrays 连接产品和优惠
    • $unwind 解构最终数组
    • $replaceRoot 替换根目录下的最终对象
    db.product.aggregate([
      {
        $facet: {
          product: [
            { $addFields: { type: "product" } }
          ]
        }
      },
      {
        $lookup: {
          from: "offer",
          as: "offer",
          pipeline: []
        }
      },
      {
        $project: {
          final: {
            $concatArrays: [
              "$product",
              {
                $map: {
                  input: "$offer",
                  in: { $mergeObjects: ["$$this", { type: "offer" }] }
                }
              }
            ]
          }
        }
      },
      { $unwind: "$final" },
      { $replaceRoot: { newRoot: "$final" } }
    ])
    

    Playground

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多