別のコレクションのオブジェクトの配列に存在する要素の数を取得しようとしていました。例:
コレクションA:
{
_id:1,
name:"Sample1"
}
{
_id:2,
name:"Sample 2"
}
{
_id:3,
"name":"Sample 3"
}
{
_id:4,
"name":"Sample 4"
}
コレクションB:
{
_id:11,
items:[ {_id:1, name:"sample1",size:1},{_id:3, name:"sample 3",size:5}]
}
{
_id:12,
items:[ {_id:1, name:"sample1",size:2},{_id:3, name:"sample 3",size:6}]
}
{
_id:13,
items:[ {_id:2, name:"sample2", size:5},{_id:1, name:"sample 1",size:8}],
is_delete:true
}
{
_id:14,
items:[ {_id:1, name:"sample1",size:3},{_id:3, name:"sample 3",size:1}]
}
注:アイテムの_idは文字列です。
期待される出力:
{
_id:1,
name:"Sample1",
count:6
}
{
_id:2,
name:"Sample 2",
count:0
}
{
_id:3,
"name":"Sample 3",
"count":12
}
{
_id:4,
"name":"Sample 4",
"count":0
}
期待される出力を得るためにmongoクエリを書くのを手伝ってください。
コレクションが2つあるので、使用する必要があります
$lookup
2つのコレクションに参加します。ここでは、相関のないサブクエリを使用しましたcolA
コレクションが、内部lookup
のpipeline
私たちは上の集約を行いますcolB
。$unwind
の構造を解除するのに役立ちますitems
。$match
不要なデータを排除するのに役立ちます(一致段階には$ exprが必要です)。$size
$reduce
の配列値を合計するのに役立ちます size
mongoスクリプトを以下に示します。
db.colA.aggregate([
{
$lookup: {
from: "colB",
let: {
bid: "$_id"
},
pipeline: [
{
$match: {
$or: [
{
is_delete: false
},
{
is_delete: {
"$exists": false
}
}
]
}
},
{
$unwind: "$items"
},
{
$match: {
$expr: {
$eq: [
"$items._id",
"$$bid"
]
}
}
},
],
as: "data"
}
},
{
$project: {
count: {
$reduce: {
input: "$data",
initialValue: 0,
in: {
$add: [
"$$value",
"$$this.items.size"
]
}
}
}
}
}
])
働くモンゴの遊び場
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加