se si vuole "peso" i risultati in base a determinati criteri o hanno alcun tipo di "valore calcolato" all'interno di una "sorta", allora avete bisogno il metodo .aggregate()
invece. Questo permette di "proiettata" valori da utilizzare nell'operazione $sort
, per cui solo un campo presente nel documento può essere utilizzato:
db.messages.aggregate([
{ "$match": { "messages": userId } },
{ "$project": {
"recipients": 1,
"unread": 1,
"content": 1,
"readYet": {
"$setIsSubset": [ [userId], "$unread" ] }
}
}},
{ "$sort": { "readYet": -1 } },
{ "$limit": 20 }
])
Qui il confronto $setIsSubset
operatore permette di matrice "leggere" con un allineamento convertito di [userId]
per vedere se ci sono delle corrispondenze. Il risultato sarà true
dove esiste l'ID utente o false
dove non lo è.
Questo può quindi essere passato a $sort
, che ordina i risultati con preferenza per le partite (decending sort è true
in alto), e, infine, $limit
solo restituisce i risultati fino alla quantità specificata.
Quindi, per utilizzare un termine calulato per "ordinare", il valore deve essere "proiettato" nel documento in modo che possa essere ordinato. Il quadro di aggregazione è come lo fai.
Si noti inoltre che $elemMatch
non è richiesto solo per far corrispondere un singolo valore all'interno di un array e che è necessario specificare solo il valore direttamente. Lo scopo è dove devono essere soddisfatte le condizioni "multiple" su un singolo elemento dell'array, che ovviamente non si applica qui.
fonte
2015-10-06 04:47:38
Questo ha funzionato perfettamente. Grazie! L'unico commento che farò è che Mongo ha generato un errore fino a quando ho cambiato $ setIsSubSet su $ setIsSubset. – beatniknight
@beatniknight Tipico me. Il collegamento alla documentazione era corretto ma il mio cervello di camelCase continua a dire che sono due parole e continua a digitarlo in quel modo. –