Er zijn hier niet veel details, maar ik kan een voorbeeld geven ter overweging. Bekijk de volgende set documenten:
{ "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" }
Dus stel dat je wilt bubbelen de items voor de gebruikers "factuur" en "ted" bovenaan uw resultaten, dan al het andere gesorteerd op de user
en de color
. Wat u kunt doen is de documenten door een $project
fase in totaal, als volgt:
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 }}
])
Dus wat dat doet is voorwaardelijk een waarde toewijzen aan weight
op basis van of de user
overeenkomt met een van de vereiste waarden. Documenten die niet overeenkomen, krijgen gewoon een 0
waarde.
Wanneer we dit aangepast verplaatsen document naar de $sort
fase, het nieuwe weight
toets kan worden gebruikt om de resultaten te ordenen, zodat de "gewogen" documenten bovenaan staan, en al het andere zal dan volgen.
Er zijn nogal wat dingen die je kunt doen om $project op deze manier een gewicht. Zie de operatorreferentie voor meer informatie:
http://docs.mongodb.org/manual/reference/operator/aggregation/