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

Evaluer betinget et array-element for at returnere

Her er et eksempel, der bruger Aggregation Framework i MongoDB 2.4.9, som jeg mener opnår det resultat, du leder efter:

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
    }}
)
 

Eksempelresultat:

{ "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 }

Bemærkninger:

  • Dette giver en antagelse om sorteringsrækkefølgen for refs hvor "default:true" mangler. Ved kort test ser den oprindelige rækkefølge ud til at være bevaret, så det "første" element i arrayet er som forventet.

  • På grund af de anvendte aggregeringsoperatorer, outputtet name er et enkelt element array og refs bliver et indlejret objekt. I stedet for at manipulere yderligere i Aggregation Framework, kan du blot henvise til de korrekte felter i din ansøgningskode.



  1. Hvordan logger jeg mine forespørgsler i MongoDB C# Driver 2.0?

  2. MongoDB Spark Connector py4j.protocol.Py4JJavaError:Der opstod en fejl under opkald til o50.load

  3. Mongodb-forbindelse i PHP virker ikke

  4. Hvordan bruger man redis' 'DUMP' og 'RESTORE' (offline)?