ここで理解すべきいくつかの落とし穴があります。
$ group
を使用する場合
境界は、初期段階または終了段階なしで検出された順序で並べ替えられます $ sort
手術。したがって、ドキュメントが元々次のような順序であった場合:
{ uid: 1, created: ISODate("2014-05-02..."), another_col : "x" },
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
次に、 $ group
を使用します。
$ sort
なし
パイプラインの最後では、次のような結果が返されます:
{ uid: 1, created: ISODate("2014-05-05..."), another_col : "y" },
{ uid: 3, created: ISODate("2014-05-05..."), another_col : "w" },
{ uid: 2, created: ISODate("2014-05-10..."), another_col : "z" },
これは1つの概念ですが、実際には、結果に期待しているのは、 uid
の並べ替えられた順序で「最後の他のフィールド」を返す必要があるようです。 あなたが探しているものです。その場合、結果を得る方法は実際には $ sort
です。 最初に $last<を利用します/ code>
演算子:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"created": { "$last": "$created" },
"another_col": { "$last": "$created" }
}}
])
または、基本的に必要なものに並べ替えを適用します。
$ last
の違い
および $ max
後者は、グループ化 _id
内の指定されたフィールドの「最高」値を選択するということです。 、ソートされていない順序で現在ソートされているかどうかに関係なく。一方、 $ last
>
「最後の」グループ化_id
と同じ「行」にある値を選択します 価値。
実際に配列の値を並べ替えようとしている場合、アプローチは似ています。配列メンバーを「作成された」順序に保つと、最初に並べ替えることもできます:
db.mycollection.aggregate([
// Sorts everything first by _id and created
{ "$sort": { "_id": 1, "created": 1 } },
// Group with the $last results from each boundary
{ "$group": {
"_id": "$uid",
"row": {
"$push": {
"created": "$created",
"another_col": "$another_col"
}
}
}}
])
そして、それらのフィールドを持つドキュメントは、すでに並べ替えられた順序で配列に追加されます。