我有一個像這樣的檔案:
[
{_id:1, field: {array: [1,2,3,4,1,1] }},
{_id:2, field: {array: [5,1,1,1,1,1] }},
{_id:3, field: {array: [3,2,3,4,1,2] }}
]
我想計算 eq 1 的陣列元素。
結果是:
[
{_id: 1, count: 3},
{_id: 2, count: 5},
{_id: 3, count: 1}
]
uj5u.com熱心網友回復:
您可以嘗試聚合查詢,
$filter迭代陣列的回圈并檢查值是否為 1$size獲取過濾后陣列的總元素
db.collection.aggregate([
{
$project: {
count: {
$size: {
$filter: {
input: "$field.array",
cond: { $eq: ["$$this", 1] }
}
}
}
}
}
])
操場
第二種可能的選擇,
$reduce迭代陣列的回圈$cond檢查值是否等于 1- 如果是 1 則
$add在 initialValue 中加一,否則回傳相同的數字
db.collection.aggregate([
{
$project: {
count: {
$reduce: {
input: "$field.array",
initialValue: 0,
in: {
$cond: [
{ $eq: ["$$this", 1] },
{ $add: ["$$value", 1] },
"$$value"
]
}
}
}
}
}
])
操場
uj5u.com熱心網友回復:
這是一個擴展的解決方案,它將獲得 的所有元素的值的分布field.array。
db.foo.aggregate([
{$addFields: {distrib: {$reduce: {
input: "$field.array",
initialValue: {"1":0,"2":0,"3":0,"4":0,"5":0},
in: {
"1":{$add:["$$value.1",{$toInt:{$eq:[1,"$$this"]}}]},
"2":{$add:["$$value.2",{$toInt:{$eq:[2,"$$this"]}}]},
"3":{$add:["$$value.3",{$toInt:{$eq:[3,"$$this"]}}]},
"4":{$add:["$$value.4",{$toInt:{$eq:[4,"$$this"]}}]},
"5":{$add:["$$value.5",{$toInt:{$eq:[5,"$$this"]}}]}
}
}}
}}
]);
通常,后續問題是如何跨多個檔案進行分發,這在某種程度上“更容易”,因為$bucket可以跨檔案管道作業:
db.foo.aggregate([
{$unwind: "$field.array"},
{$bucket: {
groupBy: "$field.array",
boundaries: [1,2,3,4,5,6,7,8,9,10],
output: {
n: {$sum:1}
}
}}
]);
或者,您可以在階段之后添加此$addFields/$reduce階段。它會產生 1 個物件的雜亂陣列,其中只有欄位n是有趣的,但是您可以使用 等輕松地在客戶端獲取值doc['1'][0]['n'], doc['2'][0]['n']。
,{$facet: {
"1": [ {$group: {_id:null, n:{$sum:"$distrib.1"}}} ],
"2": [ {$group: {_id:null, n:{$sum:"$distrib.2"}}} ],
"3": [ {$group: {_id:null, n:{$sum:"$distrib.3"}}} ],
"4": [ {$group: {_id:null, n:{$sum:"$distrib.4"}}} ],
"5": [ {$group: {_id:null, n:{$sum:"$distrib.5"}}} ]
}}
如果你真的想讓回傳結構簡單,在最后添加這個階段來折疊[0]['n']資料:
,{$addFields: {
"1": {$let:{vars:{q:{$arrayElemAt:["$1",0]}},in: "$$q.n"}},
"2": {$let:{vars:{q:{$arrayElemAt:["$2",0]}},in: "$$q.n"}},
"3": {$let:{vars:{q:{$arrayElemAt:["$3",0]}},in: "$$q.n"}},
"4": {$let:{vars:{q:{$arrayElemAt:["$4",0]}},in: "$$q.n"}},
"5": {$let:{vars:{q:{$arrayElemAt:["$5",0]}},in: "$$q.n"}}
}}
在 MongoDB 5.0 中,新$getField函式使這更簡單:
,{$addFields: {
"1": {$getField:{input:{$arrayElemAt:["$1",0]}, field:"n"}}
...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/410401.html
標籤:
