ルイス・ミゲル:
私は、以下の構造を持つ複数のドキュメントのコレクションを持っていると仮定します。
{
_id: "id12345",
objects: ["123","456", "789"]
}
今、私は、オブジェクトの配列を渡すクエリを作成し、配列の各要素のための文書に出現する回数を取得し、このような何かしたいです:
クエリの入力:["123","321"]
出力:
{
"123": 1,
"321": 0
}
私は配列を渡す、ちょうど1つのクエリによってこれをしたい、私は簡単に1の代わりに、配列のいずれかによってこれを行うことができます知っているが、それは目的ではありません。
user2683814:
あなたは3.6に集約下に使用することができます。
$match
入力アレイ及びアレイをオブジェクト間の少なくとも1つの配列が一致するフィルタドキュメントへ。
$project
$map
反復する入力配列とオブジェクトのアレイの各アレイ素子と比較して、0と1の一致に応じて返します。
$unwind
$group
すべてのドキュメント間で配列要素の出現をカウントします。
db.colname.aggregate([
{"$match":{"objects":{"$in":["123","321"]}}},
{"$project":{
"keyandcount":{
"$map":{
"input":["123","321"],
"in":{
"k":"$$this",
"v":{"$cond":[{"$in":["$$this","$objects"]},1,0]}
}
}
}
}},
{"$unwind":"$keyandcount"},
{"$group":{"_id":"$keyandcount.k","count":{"$sum":"$keyandcount.v"}}}
])
あなたは、キーと値のペアへの応答をフォーマットするために最後に2段階の下に追加することができます。
{"$group":{_id: null,"keycountpair":{"$mergeObjects":{"$arrayToObject":[[["$_id","$count"]]]}}}},
{"$replaceRoot":{"newRoot":"$keycountpair"}}