Cóż, nie ma tu zbyt wielu szczegółów, ale mogę podać przykładowy przypadek do rozważenia. Rozważ następujący zestaw dokumentów:
{ "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" }
Załóżmy więc, że chcesz bubble elementy dla użytkowników „rachunek” i „ted” u góry wyników, a następnie wszystko inne posortowane według user
i color
. To, co możesz zrobić, to uruchomić dokumenty przez $projekt
etap łącznie w następujący sposób:
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 }}
])
To, co robi, to warunkowe przypisanie wartości do weight
na podstawie tego, czy user
został dopasowany do jednej z wymaganych wartości. Dokumenty, które nie pasują, otrzymują po prostu 0
wartość.
Kiedy przenosimy ten zmodyfikowany dokument na $sort
faza, nowa weight
klucz może być użyty do uporządkowania wyników, tak aby „ważone” dokumenty były na górze, a wszystko inne nastąpi później.
Jest kilka rzeczy, które możesz zrobić, aby $project waga w ten sposób. Więcej informacji można znaleźć w instrukcji operatora:
http://docs.mongodb.org/manual/reference/operator/aggregation/