sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb:bästa sättet att få specifika dokument och sedan resten

Det finns inte så mycket detaljer här, men jag kan ge ett exempel på ett exempel. Tänk på följande uppsättning dokument:

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

Så anta att du vill bubbla objekten för användarna "bill" och "ted" till toppen av dina resultat, sedan allt annat sorterat efter user och color . Vad du kan göra är att köra dokumenten genom ett $projekt steg sammantaget, enligt följande:

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

])

Så vad det gör är att villkorligt tilldela ett värde till weight baserat på om user matchades till ett av de obligatoriska värdena. Dokument som inte matchar får helt enkelt en 0 värde.

När vi flyttar detta modifierat dokumentet vidare till $sort fas, den nya weight nyckel kan användas för att ordna resultaten så att de "viktade" dokumenten är överst, och allt annat kommer sedan att följa.

Det finns en hel del saker du kan göra för att $project en vikt på detta sätt. Se operatörens referens för mer information:

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




  1. MongoDB-as-a-Service i Kanada

  2. Hur man returnerar bara värdet i MongoDB

  3. Frågefält i en MongoDB-samling.

  4. MonogoDB Replica Set Status ändras inte från start till sekundär