集約パイプラインフレームワークを使用しています。これは単純化された例です。私はname
プロパティでドキュメントをグループ化し、city_code
値を配列にプッシュします。集約中にグループ化している間は、重複する配列の中で最も頻繁に使用する値を使用します。
これは、初期のコレクション構造である:
{
"name":"foobar",
"address":{
"city":"foo",
"destination_code":"FOO"
}
},
{
"name":"bazfoo",
"address":{
"city":"foo",
"destination_code":"FOO"
}
},
{
"name": "barbaz"
"address":{
"city":"foo",
"destination_code":"BAR"
}
},
私はcity
によってグループにそれらをしたいと、最も頻繁に単一の文字列値としてを使用してください。
、これが私のクエリです:
db.cities.aggregate([
{
"$group": {
"_id": "$address.city",
"name": {
"$first": "$address.city"
},
"city_code": {
"$push": "$address.destination_code"
}
}
},
{
"$project": {
"_id":0,
"name":1,
"city_code": 1,
}
},
])
ドク結果から、以下のようになります。私はカウントを持つオブジェクトの配列を取得するには、この更を集約する必要があることを理解し
{
"name" : "Ein Bokek",
"city_code" : [
"TLV",
"JRS",
"JRS",
"JRS",
"JRS",
"JRS",
"JRS"
]
}
重複します。
{
"name" : "Ein Bokek",
"city_code" : [
{"value":"JRS", "count":6},
{"value":"TLV", "count":1},
]
}
、最終的には最初のオブジェクトを取得し、文字列にそれを回す:それはこのように見えるように、カウント(DESC)によって
{
"name" : "Ein Bokek",
"city_code" : [
{"value": "TLV", "count":1},
{"value": "JRS", "count":6},
]
}
、その後、ソート:それは次のようになります。
{
"name" : "Ein Bokek",
"city_code" : "JRS"
}
は、追加の手順を必要としないであろうと、パイプラインの最初のグループに$push
の代わりに使用することができるオペレータにそこに構築されていますか?
集計出力ではなく、ドキュメントの初期構造はどのようになっていますか? – styvane
@ S.M.Styvane質問に初期の文書構造を追加しました。 – Kunok
あなたのパイプラインは次のようになります: '' {{"$ id":{"address": "$ address"、 "dest": "$ address.destination_code"}、 "count":{"$ {"$ limit":1}] ' – styvane