ここで質問していることの基本的な問題は、問題のデータが「配列」内にあるという事実に帰着します。したがって、これがどのように処理されるかについて、MongoDBによっていくつかの基本的な仮定があります。
「降順」で並べ替えを適用した場合、MongoDBは要求どおりに実行し、配列内の指定されたフィールドの「最大」値でドキュメントを並べ替えます。
.sort({ "revisions.created": -1 ))
ただし、代わりに「昇順」で並べ替えると、もちろんその逆になり、「最小」の値が考慮されます。
.sort({ "revisions.created": 1 })
したがって、これを行う唯一の方法は、配列内のデータから最大の日付を計算し、その結果で並べ替えることを意味します。これは基本的に.aggregate()
を適用することを意味します 、meteorの場合はサーバー側の操作ですが、残念ながら次のようになります。
Collection.aggregate([
{ "$unwind": "$revisions" },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"revisions": { "$push": "$revisions" },
"number": { "$first": "$number" }
"maxDate": { "$max": "$revisions.created" }
}},
{ "$sort": { "maxDate": 1 }
])
または、せいぜいMongoDB 3.2で、$max
配列式に直接適用できます:
Collection.aggregate([
{ "$project": {
"name": 1,
"revisions": 1,
"number": 1,
"maxDate": {
"$max": {
"$map": {
"input": "$revisions",
"as": "el",
"in": "$$el.created"
}
}
}
}},
{ "$sort": { "maxDate": 1 } }
])
しかし、実際には両方ともそれほど優れていません。MongoDB3.2アプローチのオーバーヘッドが以前のバージョンよりもはるかに少ない場合でも、データをパススルーして作業する必要があるため、パフォーマンスの点で得られるほど良くはありません。並べ替える値を取り出します。
したがって、最高の パフォーマンス、「常に」、アレイの「外部」で必要になるようなデータを保持します。このために$max
があります 「更新」演算子。提供された値が既存の値より「大きい」場合にのみ、ドキュメント内の値を置き換えます。つまり:
Collection.update(
{ "_id": "qTF8kEphNoB3eTNRA" },
{
"$push": {
"revisions": { "created": new Date("2016-02-01") }
},
"$max": { "maxDate": new Date("2016-02-01") }
}
)
つまり、必要な値は「常に」期待値とともにドキュメント内に存在するため、そのフィールドで並べ替えるだけで済みます。
.sort({ "maxDate": 1 })
だから私のお金のために、私は.aggregate()
のいずれかで既存のデータを調べます ステートメントが利用可能であり、それらの結果を使用して、「maxDate」フィールドを含むように各ドキュメントを更新します。次に、配列データのすべての追加と改訂のコーディングを変更して、その$max
を適用します。 変更のたびに「更新」します。
十分な頻度で使用している場合は、計算ではなくソリッドフィールドを使用する方が常に理にかなっています。そして、メンテナンスは非常に簡単です。
いずれにせよ、上記の適用例の日付を考慮すると、現在の他の最大日付よりも「少ない」ので、すべての形式で返されます。
{
"_id" : "5xF9iDTj3reLDKNHh",
"name" : "Lorem ipsum",
"revisions" : [
{
"number" : 0,
"comment" : "Dolor sit amet",
"created" : ISODate("2016-02-11T01:22:45.588Z")
}
],
"number" : 1,
"maxDate" : ISODate("2016-02-11T01:22:45.588Z")
}
{
"_id" : "qTF8kEphNoB3eTNRA",
"name" : "Consecitur quinam",
"revisions" : [
{
"comment" : "Hoste ad poderiquem",
"number" : 1,
"created" : ISODate("2016-02-11T23:25:46.033Z")
},
{
"number" : 0,
"comment" : "Fagor questibilus",
"created" : ISODate("2016-02-11T01:22:45.588Z")
},
{
"created" : ISODate("2016-02-01T00:00:00Z")
}
],
"number" : 2,
"maxDate" : ISODate("2016-02-11T23:25:46.033Z")
}
これは、「maxDate」を考慮して、最初のドキュメントを並べ替え順序の一番上に正しく配置します。