如何获取键值对的对象,其中值在 mongoDB 中仅具有投影字段

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

在 Mongodb 中,如何仅将必需的字段投影到 mongodb 中的嵌入对象中,其中键将是同一文档中选定字段的值,并根据字段的相似值对它们进行分组 如果您查看下面预期的结果,则必须对相同的

car_id
进行分组,并且值必须是
ObjectId
的键值对,并且只有我想要的选定字段,即
accessories
。 假设我想使用具有
brand
honda
进行匹配 以下是我在名为 CARS

的集合中收集的文档
{
_id : '1'
car_id : 'A'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}] 
},
{
_id : '2'
car_id : 'A'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}] 
},
{
_id : '3'
car_id : 'B'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}] 
}
{
_id : '4'
car_id : 'C'
brand : 'honda'
accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}] 
}

以下是我期待的结果

{
 'A' : {
          '1': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
          '2': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
       },

'B' : {
          '3': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
       },
'C' : {
          '4': {accessories : [{parts:6, name:'speaker'},{parts:2, name:'headlight'}]}
       },
}

mongodb aggregation-framework
1个回答
0
投票
  1. $group
    - 按
    car_id
    分组。使用包含
    cars
    (
    k
    ) 和
    _id
    (
    v
    数组) 字段的文档设置
    accessories
    数组字段。

  2. $group
    - 按
    null
    分组,以便将所有文档合而为一。使用文档
    data
    (
    k
    ) 和
    car_id
    (来自
    v
    的键值对)数组设置
    cars
    数组字段。

  3. $replaceRoot
    - 通过将
    data
    数组转换为键值对,用新文档替换输入文档。

db.collection.aggregate([
  {
    $group: {
      _id: "$car_id",
      cars: {
        $push: {
          k: "$_id",
          v: {
            accessories: "$accessories"
          }
        }
      }
    }
  },
  {
    $group: {
      _id: null,
      data: {
        $push: {
          k: "$_id",
          v: {
            $arrayToObject: "$cars"
          }
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$data"
      }
    }
  }
])

演示@Mongo Playground

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