Е, тук няма много подробности, но мога да дам примерен случай за разглеждане. Разгледайте следния набор от документи:
{ "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" }
Да предположим, че искате да балонирате елементите за потребителите "bill" и "ted" в горната част на вашите резултати, след това всичко останало сортирано по user
и color
. Това, което можете да направите, е да стартирате документите през $project
етап в съвкупност, както следва:
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 }}
])
Това, което прави, е условно присвояване на стойност на weight
въз основа на това дали user
беше съпоставен с една от изискваните стойности. Документи, които не съвпадат, просто получават 0
стойност.
Когато преместим това модифицирано документ към $sort
фаза, новото weight
може да се използва за подреждане на резултатите, така че "претеглените" документи да са отгоре и всичко останало ще последва след това.
Има доста неща, които можете да направите за $project тегло по този начин. Вижте препратката към оператора за повече информация:
http://docs.mongodb.org/manual/reference/operator/aggregation/