我的 Mongo DB 中有下一個資料
{
sucursal: 1
productos: [
{
producto: 1,
kilos: 50
}
]
},
{
sucursal: 2
productos: [
{
producto: 1,
kilos: 30
},
{
producto: 2,
kilos: 50
}
]
},
{
sucursal: 1
productos: [
{
producto: 1,
kilos: 50
},
{
producto: 2,
kilos: 40
}
]
},
我的目標是獲取以下格式的資料
{
sucursal: 1
productos: [
{
producto: 1,
kilos: 100
},
{
producto: 2,
kilos: 40
}
]
},
{
sucursal: 2
productos: [
{
producto: 1,
kilos: 30
},
{
producto: 2,
kilos: 50
}
]
}
我正在使用貓鼬和 nodeJS。我正在使用 $group 的聚合函式,但我沒有得到預期的結果,我想知道我做錯了什么。我的目標是將所有“sucursales”分組而不重復任何元素,每個“sucursal”都應該有一個陣列,其中包含每個“sucursal”中具有相同名稱但不重復任何“producto”的所有“productos”,而不是重復元素,函式應該將值添加到具有相同名稱的元素(參見上面的資料示例)。
我正在使用的代碼是這樣的:
const ordenesTotal = await OrdCompCli.aggregate([
{
$match: {fechaEntrega: new Date(fecha), estado: {$gt : 0, $lt : 5}}
},
{
$unwind: "$productos"
},
{
$group: {
_id: "$sucursal",
productos: {
$addToSet: {
producto: "$productos.producto",
totalKilos: {
$sum: "$productos.kilos"
}
}
}
}
},
{
$project: {
_id: 0,
sucursal: "$_id",
productos: 1
},
},
])
這段代碼給了我這個結果:
{
sucursal: 1
productos: [
{
producto: 1,
kilos: 50
},
{
producto: 2,
kilos: 40
},
{
producto: 1,
kilos: 50
},
]
},
{
sucursal: 2
productos: [
{
producto: 1,
kilos: 30
},
{
producto: 2,
kilos: 50
}
]
}
這個結果不是我所期望的,因為同名的“producto”沒有被分組。有人可以告訴我我做錯了什么嗎?
uj5u.com熱心網友回復:
您需要$group分 2 個單獨的階段進行。
db.collection.aggregate([
{
"$unwind": "$productos"
},
{
$group: {
_id: {
sucursal: "$sucursal",
producto: "$productos.producto"
},
kilos: {
$sum: "$productos.kilos"
}
}
},
{
"$group": {
"_id": "$_id.sucursal",
"productos": {
"$push": {
producto: "$_id.producto",
kilos: "$kilos"
}
}
}
},
//cosmetics
{
"$addFields": {
"sucursal": "$_id"
}
},
{
"$unset": "_id"
}
])
蒙戈游樂場
uj5u.com熱心網友回復:
之前已經多次詢問和回答過這個問題。“按屬性分組物件陣列”。不過,這需要兩個級別的分組。
var input = [{
sucursal: 1,
productos: [{
producto: 1,
kilos: 50
}]
}, {
sucursal: 2,
productos: [{
producto: 1,
kilos: 30
},
{
producto: 2,
kilos: 50
}
]
}, {
sucursal: 1,
productos: [{
producto: 1,
kilos: 50
},
{
producto: 2,
kilos: 40
}
]
}]
var output = Object.values(input.reduce(function(agg, item) {
agg[item.sucursal] = agg[item.sucursal] || {
sucursal: item.sucursal,
productos: []
}
agg[item.sucursal].productos = [...agg[item.sucursal].productos, ...item.productos]
return agg;
}, {})).map(function(item) {
item.productos = Object.values(item.productos.reduce(function(agg, product) {
agg[product.producto] = agg[product.producto] || {
producto: product.producto,
kilos: 0
}
agg[product.producto].kilos = product.kilos
return agg;
}, {}))
return item;
})
console.log(output)
.as-console-wrapper {
max-height: 100% !important
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/529761.html
上一篇:mongodb-使用geoNear而不省略非2dsphere索引行
下一篇:從C#中的聚合函式中獲取計數
