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/