私は2つのコレクションを持っています。boxes
およびballs
。ボールは箱の中に入れることができます:
boxes:
[{
"_id": { "$oid": "box-a" },
"name": "Box A"
},{
"_id": { "$oid": "box-b" },
"name": "Box B"
}]
balls:
[{
"_id": { "$oid": "ball-a" },
"color": "red",
"boxId": { "$oid": "box-a" }
},{
"_id": { "$oid": "ball-b" },
"color": "green",
"boxId": { "$oid": "box-a" }
}]
ここで、追加のフィールドを使用してすべてのボックスにクエリを実行ballColors
し、ボックス内にある色のボールの数の概要を取得します。
[{
"_id": { "$oid": "box-a" },
"name": "Box A",
"ballColors": {
"red": 1,
"green": 1,
}
},{
"_id": { "$oid": "box-b" },
"name": "Box B",
"ballColors": {}
}]
私は次のような集計でそれを解決しようとしました:
db.boxes.aggregate([
{$lookup: {
from: "balls",
localField: "_id",
foreignField: "boxId",
as: "ballColors"
}},
{$addFields: {
ballColors: "$ballColors.color"
}}
])
...しかし、これは私にそのようなものを与えます:
[{
"_id": { "$oid": "box-a" },
"name": "Box A",
"ballColors": [
"red",
"green"
]
},{
"_id": { "$oid": "box-b" },
"name": "Box B",
"ballColors": []
}]
と$unwind
組み合わせていくつかの実験も行い$group
ましたが、それらの情報を元のオブジェクトに戻す方法がわかりません...
色を数えてballColors
オブジェクトに入れる方法はありますか?または、これを行う別のより良い方法はありますか?
$lookup
パイプラインを_id
使用boxID
してlet
、$match
boxId
条件を通過します$group
によってcolor
、合計数を取得します$project
kを色として、vをカウントとして表示します$arrayTOobject
で$addFields
db.boxes.aggregate([
{
$lookup: {
from: "balls",
let: { boxId: "$_id" },
pipeline: [
{ $match: { $expr: { $eq: ["$$boxId", "$boxId"] } } },
{
$group: {
_id: "$color",
count: { $sum: 1 }
}
},
{
$project: {
_id: 0,
k: "$_id",
v: "$count"
}
}
],
as: "ballColors"
}
},
{ $addFields: { ballColors: { $arrayToObject: "$ballColors" } } }
])
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加