Der er ikke mange detaljer her, men jeg kan give et eksempel til overvejelse. Overvej følgende sæt dokumenter:
{ "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å antag, at du vil boble elementerne for brugerne "bill" og "ted" til toppen af dine resultater, derefter alt andet sorteret efter user
og color
. Det du kan gøre er at køre dokumenterne gennem et $projekt
trin samlet, som følger:
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å det, der gør, er at betinget tildele en værdi til weight
baseret på om user
blev matchet til en af de påkrævede værdier. Dokumenter, der ikke matcher, får blot en 0
værdi.
Når vi flytter denne modificerede dokument videre til $sort
fase, den nye weight
nøglen kan bruges til at sortere resultaterne, så de "vægtede" dokumenter er øverst, og alt andet vil derefter følge.
Der er en hel del ting, du kan gøre for at $project en vægt på denne måde. Se operatørens reference for mere information:
http://docs.mongodb.org/manual/reference/operator/aggregation/