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

mongodb:il modo migliore per ottenere documenti specifici e poi il resto

Bene, non ci sono molti dettagli qui, ma posso fornire un caso campione da considerare. Considera il seguente insieme di documenti:

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

Supponiamo quindi di voler bollere le voci per gli utenti "fatturazione" e "ted" in cima ai tuoi risultati, quindi tutto il resto ordinato per user e il color . Quello che puoi fare è eseguire i documenti attraverso un $project fase in aggregato, come segue:

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

])

Quindi ciò che fa è assegnare condizionatamente un valore a weight a seconda che l'user è stato abbinato a uno dei valori richiesti. Ai documenti che non corrispondono viene semplicemente assegnato un 0 valore.

Quando spostiamo questo modificato documento su $sort fase, il nuovo weight è possibile utilizzare il tasto per ordinare i risultati in modo che i documenti "pesati" siano in primo piano e qualsiasi altra cosa seguirà.

Ci sono molte cose che puoi fare per $project un peso in questo modo. Per ulteriori informazioni, vedere il riferimento dell'operatore:

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