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

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

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

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

我正在尝试执行查找,以将

mechanicalitems
electricalitems
中的所有字段放入程序集集合中,但很难使
$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 aggregation-framework lookup aggregation
1个回答
2
投票
  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.