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

Използване на агрегиране за сортиране в сложно условно в Mongodb

Първо, обърнете внимание, че вашият пример за сортиране е неправилно образуван:методът за агрегиране приема масив като вход, където всеки елемент в масива указва етап в тръбопровода за агрегиране. Също така имайте предвид, че $elemMatch операторът не може да се използва като част от етап $sort.

Един от начините да постигнете това, което се опитвате да направите с вашия пример за сортиране, е да използвате $unwind оператор на тръбопровод. Развиването на масив ще отдели елементите на масива един по един в отделни документи. Например следната заявка

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

връща нещо като следното:

[
    {
        "_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"
        }
    }
]

Добавянето на $match фаза ще ви позволи да вземете само документите, където answers.id е нула. И накрая, фазата на $sort ви позволява да сортирате по answers.value. Като цяло заявката за агрегиране е:

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

И резултатът:

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

Въз основа на това, което питате, не изглежда винаги да имате нужда от $unwind или дори от рамката за агрегиране. Ако вместо това искате да намерите документа с answers.id, равен на 0 и answers.value, равен на 3,5, и след това промените answers.value на 4, можете да използвате find с $elemMatch, последван от 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. MongoServer.State еквивалент в драйвера 2.0

  2. Как да намеря низове със съвпадащи букви в списък/масив с помощта на ламбда функция?

  3. Битката на базите данни NoSQL - Сравняване на MongoDB и Firebase

  4. Използване на cloneCollection в MongoDB:как да се удостоверя?

  5. Защо методът findRandom() mongoose за node.js не работи?