配列内の「キー」として「ポイント」値を持つすべてのドキュメントが必要であると想定し、その「キー」の「値」で並べ替えると、これは少し範囲外になります。 .find()
メソッド。
このようなことをした場合の理由
db.collection.find({
"setid": 154421, "data.k": "point" }
).sort({ "data.v" : -1 })
問題は、 一致した要素は実行 「ポイント」の一致するキーがある場合、どちらかを判断する方法はありません data.v
あなたはソートのために参照しています。また、sort
.find()
内 結果は次のようなことはしません:
db.collection.find({
"setid": 154421, "data.k": "point" }
).sort({ "data.$.v" : -1 })
試してみる ソート内で位置演算子を使用し、基本的にv
の値を使用する要素を指示します の上。ただし、これはサポートされておらず、サポートされていない可能性があります。最も可能性の高い説明として、その「インデックス」値はドキュメントごとに異なる可能性があります。
しかし、この種の選択的 並べ替えは、.aggregate()
。
db.collection.aggregate([
// Actually shouldn't need the setid
{ "$match": { "data": {"$elemMatch": { "k": "points" } } } },
// Saving the original document before you filter
{ "$project": {
"doc": {
"_id": "$_id",
"setid": "$setid",
"date": "$date",
"version": "$version",
"data": "$data"
},
"data": "$data"
}}
// Unwind the array
{ "$unwind": "$data" },
// Match the "points" entries, so filtering to only these
{ "$match": { "data.k": "points" } },
// Sort on the value, presuming you want the highest
{ "$sort": { "data.v": -1 } },
// Restore the document
{ "$project": {
"setid": "$doc.setid",
"date": "$doc.date",
"version": "$doc.version",
"data": "$doc.data"
}}
])
もちろん、それはdata
を前提としています アレイには1つしかありません キーポイントを持つ要素。複数ある場合は、$group
する必要があります このような並べ替えの前に:
// Group to remove the duplicates and get highest
{ "$group": {
"_id": "$doc",
"value": { "$max": "$data.v" }
}},
// Sort on the value
{ "$sort": { "value": -1 } },
// Restore the document
{ "$project": {
"_id": "$_id._id",
"setid": "$_id.setid",
"date": "$_id.date",
"version": "$_id.version",
"data": "$_id.data"
}}
したがって、 .aggregate()
複雑なを行うために ドキュメントを並べ替えても、元のドキュメントの結果を完全に返します。
集計演算子
についてもう少し読んでください。 そして一般的なフレームワーク。これは、.find()
を超えて学習するための便利なツールです。 。