MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Używanie agregacji do sortowania w złożonych warunkach warunkowych w Mongodb

Po pierwsze, zauważ, że przykład sortowania jest zniekształcony:metoda agregująca przyjmuje jako dane wejściowe tablicę, w której każdy element tablicy określa etap potoku agregacji. Pamiętaj też, że $elemMatch operator nie może być użyty jako część etapu $sort.

Jednym ze sposobów osiągnięcia tego, co próbujesz zrobić z przykładem sortowania, jest użycie Zrelaksuj się operator rurociągu. Rozwijanie tablicy oddzieli elementy tablicy jeden po drugim na oddzielne dokumenty. Na przykład następujące zapytanie

db.my_collection.aggregate([ {$unwind: "$answers"} ]);

zwraca coś takiego:

[
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 0,
            "value" : 3.5
        }
    },
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 1,
            "value" : "hello"
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 0,
            "value" : 0.5
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 1,
            "value" : "world"
        }
    }
]

Dodanie fazy $match pozwoli ci pobrać tylko te dokumenty, w których Answers.id jest zero. Wreszcie faza $sort umożliwia sortowanie według odpowiedzi.wartość. Podsumowując, zapytanie agregujące to:

db.my_collection.aggregate([
    {$unwind: "$answers"},
    {$match: {"answers.id": 0}},
    {$sort: {"answers.value": -1}}
]);

A wynik:

[
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 0,
            "value" : 3.5
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 0,
            "value" : 0.5
        }
    }
]

W oparciu o to, o co prosisz, nie wydaje się, że zawsze będziesz potrzebować $unwind ani nawet struktury agregacji. Jeśli zamiast tego chcesz znaleźć dokument z answer.id równym 0 i answer.value równym 3,5, a następnie zmień answer.value na 4, możesz użyć find z $elemMatch, a następnie db.collection.save():

doc = db.my_collection.findOne({"answers": {$elemMatch: {"id": 0, "value": 3.5}}});
for (i=0; i<doc.answers.length; i++) {
  if (doc.answers[i].id === 0) {
    doc.answers[i].value = 4;
    db.my_collection.save(doc);
    break;
  }
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Co jest nie tak z MongoDB usuwającym zapytanie za pomocą mongodb java dla podtablicy dokumentu?

  2. Zagnieżdżone komentarze w MongoDB

  3. Sortowanie według wielu pól Mongo DB

  4. Jaki jest maksymalny rozmiar GridFS w MongoDB?

  5. Jak mogę sprawdzić, czy polecenie aktualizacji mongo powiodło się w węźle?