sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongo sorterar på ett beräknat skick

Om du vill "vikta" resultat efter vissa kriterier eller ha någon form av "beräknat värde" inom en "sortering", behöver du .aggregate() metod istället. Detta gör att "projicerade" värden kan användas i $sort operation, för vilken endast ett befintligt fält i dokumentet kan användas:

db.messages.aggregate([
    { "$match": { "messages": userId } },
    { "$project": {
        "recipients": 1,
        "unread": 1,
        "content": 1,
        "readYet": {
            "$setIsSubset": [ [userId], "$unread" ] }
        }
    }},
    { "$sort": { "readYet": -1 } },
    { "$limit": 20 }
])

Här är $setIsSubset operatorn tillåter jämförelse av den "olästa" arrayen med en konverterad array av [userId] för att se om det finns några matchningar. Resultatet blir antingen true där användar-ID finns eller false där det inte gör det.

Detta kan sedan skickas till $sort , som ordnar resultaten med företräde framför matchningarna ( fallande sortering är true på toppen ), och slutligen $limit returnerar bara resultaten upp till det angivna beloppet.

Så för att använda en beräknad term för "sortera", måste värdet "projiceras" in i dokumentet så att det kan sorteras efter. Aggregeringsramverket är hur du gör detta.

Observera också att $elemMatch krävs inte bara för att matcha ett enskilt värde inom en array, och du behöver bara ange värdet direkt. Syftet är att "flera" villkor måste uppfyllas på ett enda arrayelement, vilket naturligtvis inte gäller här.




  1. Node.js &Redis; Väntar på att en loop ska sluta

  2. Stackexchange.Redis varför upprättar ConnectionMultiplexer.Connect två klientanslutningar?

  3. Enheter att använda för maxdistance och MongoDB?

  4. mongoose/mongodb anpassad sortering