MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да агрегираме с групиране по и правилно сортиране

Тук има няколко уловки, за да разберете.

Когато използвате $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" },

Това е една концепция, но всъщност изглежда, че това, което очаквате в резултатите, изисква връщане на „последните други полета“ по сортиран ред на uid е това, което търсите. В този случай начинът да получите вашия резултат е всъщност $sort първо и след това използвайте $last оператор:

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

И документите с тези полета ще бъдат добавени към масива в реда, по който вече са били сортирани.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Влошаване на производителността на актуализации на документи mongoldb с нарастване на записа

  2. Как получавате достъп до конкретен елемент от масив в агрегирането на проекции на MongoDB?

  3. Как да стартирате необработени mongodb команди от pymongo

  4. spring mvc rest response json и xml

  5. MongoDB - колекция от копия в java, без да се повтарят всички елементи