sql >> Databáze >  >> NoSQL >> MongoDB

Použití agregace k řazení v komplexním podmíněném v Mongodb

Nejprve si všimněte, že váš příklad řazení je chybný:agregační metoda bere jako vstup pole, kde každý prvek v poli určuje fázi v agregačním kanálu. Všimněte si také, že $elemMatch operátor nelze použít jako součást fáze $sort.

Jedním ze způsobů, jak dosáhnout toho, co se snažíte udělat s vaším příkladem řazení, je použití agregačního rámce $odpočiňte si provozovatel potrubí. Rozbalení pole odloupne prvky pole jeden po druhém do samostatných dokumentů. Například následující dotaz

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

vrátí něco jako následující:

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

Přidání $match fáze vám umožní uchopit pouze dokumenty, kde answer.id je nula. Nakonec vám fáze $sort umožňuje třídit podle answer.value. Souhrnný agregační dotaz je:

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

A výstup:

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

Na základě toho, co se ptáte, to nezní, že budete vždy potřebovat $unwind nebo dokonce agregační rámec. Pokud jste místo toho chtěli najít dokument s Answers.id rovným 0 a Answers.value rovnou 3,5 a poté změnit Answers.value na 4, můžete použít find s $elemMatch následovaným 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. Vytváření prázdné kolekce v mongodb

  2. jak převést pole na objekt v MongoDB

  3. Jak mohu přejmenovat sbírku v MongoDB?

  4. OAuth 2.0 – Kdy by měl být přístupový token obnoven s obnovovacím tokenem?