MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara menggabungkan dengan grup berdasarkan dan mengurutkan dengan benar

Ada beberapa hal yang perlu dipahami di sini.

Saat Anda menggunakan $group batas-batas akan diurutkan sesuai urutan penemuannya tanpa tahap awal atau akhir $sort operasi. Jadi jika dokumen Anda awalnya dalam urutan seperti ini:

{ 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" },

Kemudian cukup gunakan $group tanpa $sort pada akhirnya pada pipa akan mengembalikan Anda hasil seperti ini:

{ 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" },

Itu adalah satu konsep, tetapi sepertinya apa yang Anda harapkan dalam hasil memerlukan pengembalian "bidang lain terakhir" dengan urutan uid yang diurutkan adalah apa yang Anda cari. Dalam hal ini cara untuk mendapatkan hasil Anda sebenarnya adalah $sort pertama dan kemudian gunakan $last operator:

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" }
    }}
])

Atau pada dasarnya terapkan pengurutan sesuai keinginan Anda.

Perbedaan antara $last dan $max adalah bahwa yang terakhir akan memilih nilai "tertinggi" untuk bidang yang diberikan dalam pengelompokan _id , terlepas dari saat ini diurutkan pada urutan yang tidak diurutkan. Di sisi lain, $last akan memilih nilai yang muncul pada "baris" yang sama dengan pengelompokan "terakhir" _id nilai.

Jika Anda benar-benar ingin mengurutkan nilai array maka pendekatannya serupa. Menjaga anggota array dalam urutan "dibuat" Anda juga akan mengurutkan terlebih dahulu:

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"
            }
        }
    }}
])

Dan dokumen dengan bidang tersebut akan ditambahkan ke larik dengan urutan yang sudah diurutkan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Agregat $unwind $match using date - apa yang saya lewatkan?

  2. Atribut BsonElement dan logika deserialisasi khusus dengan driver MongoDB C#

  3. Banyak bidang dalam Dokumen mongoengine Django

  4. Kesalahan Express/Node.js:Kesalahan Referensi:Res tidak ditentukan

  5. Linq ke Filter MongoDB