在mongoDB中使用replaceRoot

在mongoDB中使用replaceRoot,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我的收藏是这样的: { { "productType":"Bike", "company":"yamaha", "model":"y1" }, { "productType":"Bike", "company":"bajaj&quo

我的收藏是这样的:

{
   {
      "productType":"Bike",
      "company":"yamaha",
      "model":"y1"
   },
   {
      "productType":"Bike",
      "company":"bajaj",
      "model":"b1"
   },
   {
      "productType":"Bike",
      "company":"yamaha",
      "model":"y1"
   },
   {
      "productType":"Car",
      "company":"Maruti",
      "model":"m1"
   },
   {
      "productType":"Bike",
      "company":"yamaha",
      "model":"y2"
   },
   {
      "productType":"Car",
      "company":"Suzuki",
      "model":"s1"
   }
}
我想要这些数据:


  [ "Bike":{
      "Yamaha":{
         "y1":2,
         "y2":1
      },
      "Bajaj":{
         "b1":1
      }
   },
   "Car":{
      "Maruti":{
         "m1":1
      },
      "Suzuki":{
         "s1":1
      }
   
]
我尝试使用
$replaceRoot
,但无法使用它(键应该是
productType
然后是
company
然后是
model
,该模型的
count
作为值)。如何做到这一点?在哪种情况下,我们应该使用$replaceRoot

编辑:因为整个答案都在json对象中,所以我删除了它。

  • $group
    产品类型
    公司
    型号
    分类,并计算总数
  • $group
    productType
    company
    使用
    model
    count
    以键值格式构建模型数组
  • $group
    根据
    productType
    ,使用
    company
    构造公司数组,并使用
    $arrayToObject
    从数组转换而来的
    model
    对象
  • $group
    按null,使用
    product
    company
    对象构造
    product
    的数组,该对象是使用
    $arrayToObject
    从数组转换而来的
  • $replaceRoot
    使用
    $arrayToObject

解决方案#1:结果为单独的文档

db.products.aggregate([
{
$group:{
_身份证:{
公司:“$company”,
型号:“$model”
},
产品类型:{$first:$productType},
计数:{$sum:1}
}
},
{
$group:{
_id:“$\u id.company”,
产品类型:{$first:$productType},
五:{
$push:{
k:“$\u id.model”,
五:“$计数”
}
}
}
},
{
$group:{
_id:“$productType”,
k:{$first:$productType},
五:{
$push:{
k:“$\u id”,
v:{$arrayToObject:$v}
}
}
}
},
{
$replace替换为:{
数组:[
{
k:“$k”,
v:{$arrayToObject:$v}
}
]
}
},
{
$replaceRoot:{
newRoot:{$arrayToObject:$array}
}
}
]);
输出:结果作为单独的文档

/*1*/
{
“自行车”:{
“雅马哈”:{
“y1”:2,
“y2”:1
},
“bajaj”:{
“b1”:1
}
}
},
/* 2 */
{
“汽车”:{
“马鲁蒂”:{
“m1”:1
},
“铃木”:{
“s1”:1
}
}
}
解决方案#2:结果为单个文档

db.products.aggregate([
{
$group:{
_身份证:{
公司:“$company”,
型号:“$model”
},
产品类型:{$first:$productType},
计数:{$sum:1}
}
},
{
$group:{
_id:“$\u id.company”,
产品类型:{$first:$productType},
五:{
$push:{
k:“$\u id.model”,
五:“$计数”
}
}
}
},
{
$group:{
_id:“$productType”,
k:{$first:$productType},
五:{
$push:{
k:“$\u id”,
v:{$arrayToObject:$v}
}
}
}
},
{
$group:{
_id:null,
数组:{
$push:{
k:“$k”,
v:{$arrayToObject:$v}
}
}
}
},
{
$replaceRoot:{
newRoot:{$arrayToObject:$array}
}
}
]);
输出:结果为单个文档

{
“自行车”:{
“bajaj”:{
“b1”:1
},
“雅马哈”:{
“y1”:2,
“y2”:1
}
},
“汽车”:{
“马鲁蒂”:{
“m1”:1
},
“铃木”:{
“s1”:1
}
}
}

我只得到了一个额外的父项(或密钥),其中整个答案被包围为值。该键名为“products”。能否确认此聚合()始终以数组形式返回,以便可以使用response.Perfect中的直接零元素。谢谢你的解释。太好了。谢谢
db.collection.aggregate([
  {
    $group: {
      _id: {
        productType: "$productType",
        company: "$company",
        model: "$model"
      },
      count: { $sum: 1 }
    }
  },
  {
    $group: {
      _id: {
        productType: "$_id.productType",
        company: "$_id.company"
      },
      model: {
        $push: {
          k: "$_id.model",
          v: "$count"
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.productType",
      company: {
        $push: {
          k: "$_id.company",
          v: { $arrayToObject: "$model" }
        }
      }
    }
  },
  {
    $group: {
      _id: null,
      product: {
        $push: {
          k: "$_id",
          v: { $arrayToObject: "$company" }
        }
      }
    }
  },
  { $replaceRoot: { newRoot: { $arrayToObject: "$product" } } }
])