sql >> Database teknologi >  >> NoSQL >> MongoDB

Brug af aggregering til at sortere i kompleks betinget i Mongodb

Bemærk først, at dit sorteringseksempel er forkert udformet:aggregeringsmetoden tager et array som input, hvor hvert element i arrayet angiver et trin i en aggregeringspipeline. Bemærk også, at $elemMatch operator kan ikke bruges som en del af et $sort-stadium.

En måde at opnå det, du forsøger at gøre med dit sorteringseksempel, er at bruge aggregeringsrammernes $slappe af rørledningsoperatør. Afvikling af et array vil flå array-elementerne af en efter en i separate dokumenter. For eksempel følgende forespørgsel

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

returnerer noget i stil med følgende:

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

Tilføjelse af en $match-fase vil tillade dig kun at få fat i de dokumenter, hvor answers.id er nul. Endelig giver en $sort-fase dig mulighed for at sortere efter answers.value. Sammenlagt er aggregeringsforespørgslen:

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

Og outputtet:

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

Baseret på hvad du spørger om, lyder det ikke som om du altid har brug for $unwind eller endda aggregeringsrammen. Hvis du i stedet ville finde dokumentet med answers.id lig med 0 og answers.value lig med 3,5 og derefter ændre answers.value til 4 kunne du bruge find med $elemMatch efterfulgt af 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. ClassCastException under JNDI-opslag til MongoDB, inde i WAB, der kører Liberty

  2. Hvad er forskellen mellem tidsskrift og ikke-tidsskrift Mongodb-database

  3. Hvordan registrerer jeg AbstractMongoEventListener programmatisk?

  4. Kan ikke deserialisere streng fra BsonType ObjectId i MongoDb C#