sql >> Database >  >> NoSQL >> MongoDB

Een array-element voorwaardelijk evalueren om te retourneren

Hier is een voorbeeld van het gebruik van het Aggregation Framework in MongoDB 2.4.9 waarvan ik denk dat het het gewenste resultaat bereikt:

db.books.aggregate(

    // Unwind the refs array
    { $unwind: "$refs" },

    // Sort by refs.default descending so "true" values will be first, nulls last
    { $sort: {
        "refs.default" : -1
    }},

    // Group and take the first ref; should either be "default:true" or first element
    { $group: {
        _id: "$_id",
        name: { $addToSet: "$name" },
        refs: { $first: "$refs" }
    }},

    // (optional) Sort by name to match the example output
    { $sort: {
        name: 1,
    }},

    // (optional) Clean up output
    { $project: {
        _id: 0,
        name: 1,
        refs: 1
    }}
)

Voorbeeld resultaat:

{
    "result" : [
        {
            "name" : [
                "Book1"
            ],
            "refs" : {
                "oid" : "object5",
                "default" : true
            }
        },
        {
            "name" : [
                "Book2"
            ],
            "refs" : {
                "oid" : "object5",
                "default" : true
            }
        },
        {
            "name" : [
                "Book3"
            ],
            "refs" : {
                "oid" : "object4"
            }
        },
        {
            "name" : [
                "Book4"
            ],
            "refs" : {
                "oid" : "object4",
                "default" : true
            }
        }
    ],
    "ok" : 1
}

Opmerkingen:

  • Dit maakt een aanname over het sorteervolgordegedrag voor refs waar "default:true" ontbreekt. Bij een korte test lijkt de oorspronkelijke volgorde behouden te zijn, dus het "eerste" element van de array is zoals verwacht.

  • Vanwege de gebruikte aggregatie-operators is de output name is een array met één element, en refs wordt een embedded object. In plaats van verder te manipuleren in het Aggregation Framework, kunt u gewoon verwijzen naar de juiste velden in uw applicatiecode.



  1. Laravel + predis + Redis cluster - VERPLAATST / geen verbinding naar 127.0.0.1:6379

  2. Is het een goed idee om dagelijkse collecties te genereren in mongodb

  3. juiste manier om het json-formaat te retourneren met behulp van node of express

  4. MongoDB-back-upopties begrijpen