在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
按null,使用$group
和product
对象构造company
的数组,该对象是使用product
从数组转换而来的$arrayToObject
使用$replaceRoot
$arrayToObject
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" } } }
])