sql >> Database >  >> NoSQL >> MongoDB

mongodb:beste manier om specifieke documenten te krijgen en dan de rest

Er zijn hier niet veel details, maar ik kan een voorbeeld geven ter overweging. Bekijk de volgende set documenten:

{ "user" : "fred", "color" : "black" }
{ "user" : "bill", "color" : "blue" }
{ "user" : "ted", "color" : "red" }
{ "user" : "ted", "color" : "black" }
{ "user" : "fred", "color" : "blue" }
{ "user" : "bill", "color" : "red" }
{ "user" : "bill", "color" : "orange" }
{ "user" : "fred", "color" : "orange" }
{ "user" : "ted", "color" : "orange" }
{ "user" : "ally", "color" : "orange" }
{ "user" : "alice", "color" : "orange" }
{ "user" : "alice", "color" : "red" }
{ "user" : "bill", "color" : "purple" }

Dus stel dat je wilt bubbelen de items voor de gebruikers "factuur" en "ted" bovenaan uw resultaten, dan al het andere gesorteerd op de user en de color . Wat u kunt doen is de documenten door een $project fase in totaal, als volgt:

db.bubble.aggregate([

    // Project selects the fields to show, and we add a weight value
    {$project: {
        _id: 0,
        "user": 1,
        "color": 1,
        "weight": {$cond:[
            {$or: [
                {$eq: ["$user","bill"]},
                {$eq: ["$user","ted"]}
            ]},
            1,
            0
         ]}
     }},

    // Then sort the results with the `weight` first, then `user` and `color`
    {$sort: { weight: -1, user: 1, color: 1 }}

])

Dus wat dat doet is voorwaardelijk een waarde toewijzen aan weight op basis van of de user overeenkomt met een van de vereiste waarden. Documenten die niet overeenkomen, krijgen gewoon een 0 waarde.

Wanneer we dit aangepast verplaatsen document naar de $sort fase, het nieuwe weight toets kan worden gebruikt om de resultaten te ordenen, zodat de "gewogen" documenten bovenaan staan, en al het andere zal dan volgen.

Er zijn nogal wat dingen die je kunt doen om $project op deze manier een gewicht. Zie de operatorreferentie voor meer informatie:

http://docs.mongodb.org/manual/reference/operator/aggregation/




  1. Aggregatie met update in mongoDB

  2. Een element verwijderen uit een dubbel geneste array in een MongoDB-document.

  3. MongoDB document invoegen of veld verhogen indien aanwezig in array

  4. Hoe kan ik sorteren dat nulls als laatste in mongodb worden besteld?