Mongo 聚合并查找具有多个数组的对象

问题描述 投票:0回答:1

我有一个包含对象的集合,每个对象都包含多个数组。例如

    assmemblies: { 
      mechanicalItems: [{ 
        mechanicalId: <ObjectId that references the mechanicalitems collection>,
        quantity: Number
      }],
      electricalItems: [{ 
        mechanicalId: <ObjectId that references the mechanicalitems collection>
        quantity: Number
    }],

我正在尝试执行查找,以将机械项目和电气项目中的所有字段放入组件集合中,但很难使 $lookup 工作。

当我尝试展开和分组时,我丢失了另一个数组,或者它最终嵌套在另一个数组的每个数组对象内。

我也尝试直接投影回数量属性,但我得到的是所有数量的数组:

{
    $lookup: {
      from: "mechanicalitems",
      let: {
        mechanicalItem: "$mechanicalItems",
        item: "$machanicalItems.mechanicalId",
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: ["$_id", "$$item"],
            },
          },
        },
        {
          $project: {
            "quantity": "$$mechanicalItem.quantity" // <-- this gives an array of all the quantities
          }
        },
      ],
      as: "mechanicalItems",
    },
  },

我尝试了一些其他选项,但无法完全得到我正在寻找的东西。

*** 编辑 - 预期输出

如果我的 MechanicalItems 字段为:“尺寸”、“材料”、“样式”,而我的 ElectricalItems 字段为:“电流”、“额定值”、“绝缘”,那么我的预期输出为:

assemblies: {
  mechanicalItems: [{
    item: {
      _id: <some ObjectId>
      size: '12',
      material: 'steel',
      style: 'thick'
    },
    quantity: Number
 }, ...
 ],
 electricalItems: [{
    item: {
      _id: <some ObjectId>
      current: '15',
      rating: 'low voltage',
      insulation: 'PVC'
    },
    quantity: Number
  }, ...
  ]
}

我希望将 MechanicalItemId 替换为 MechanicalItems 集合中的实际对象(并最终将该字段重命名为“item”,但我可以稍后使用 $addFields 或 $project 来做到这一点)。

mongodb lookup aggregation
1个回答
0
投票
  1. 有一个拼写错误:

    $machanicalItems.mechanicalId
    ,应该是
    $mechanicalItems.mechanicalId

  2. mechanicalItem.quantity
    返回一个数字数组,因为
    mechanicalItem
    是一个数组。相反,您需要获取
    quantity
    数组的匹配文档的单个
    mechanicalItem
    值,并将其设置到
    quantity
    字段。

db.assemblies.aggregate([
  {
    $lookup: {
      from: "mechanicalitems",
      let: {
        mechanicalItem: "$mechanicalItems",
        item: "$mechanicalItems.mechanicalId"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$_id",
                "$$item"
              ]
            }
          }
        },
        {
          $set: {
            "quantity": {
              $first: {
                $map: {
                  input: {
                    $filter: {
                      input: "$$mechanicalItem",
                      cond: {
                        $eq: [
                          "$_id",
                          "$$this.mechanicalId"
                        ]
                      }
                    }
                  },
                  in: "$$this.quantity"
                }
              }
            }
          }
        }
      ],
      as: "mechanicalItems"
    }
  }
])

当您查找与

electricalItems
集合的连接时,
electricalItems
数组的逻辑是相同的。

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.