Не мога да възпроизведа грешката ви, но имате няколко „печатни грешки“ във въпроса си, така че не мога да съм сигурен какво всъщност имате.
Но ако приемем, че всъщност работите с MongoDB 2.6 или по-нова версия, вероятно искате $setIntersection
или $setIsSubset
оператори вместо $setUnion
. Тези оператори предполагат „съвпадение“ на съдържанието на масива, с който се сравняват, където $setUnion
просто комбинира предоставения масив със съществуващия:
db.people.aggregate([
{ "$project": {
"first_name": 1,
"last_name": 1,
"sticky": {
"$size": {
"$setIntersection": [ "$offices", [ "FL", "SC" ]]
}
},
"offices": 1
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
В предишни версии, където нямате тези оператори за задаване
вие просто използвате $unwind
за работа с масива и същия вид $cond
операция както преди в рамките на $group
за да съберем всичко обратно:
db.people.aggregate([
{ "$unwind": "$offices" },
{ "$group": {
"_id": "$_id",
"first_name": { "$first": "$first_name" },
"last_name": { "$first": "$last_name",
"sticky": { "$sum": { "$cond": [
{ "$or": [
{ "$eq": [ "$offices": "FL" ] },
{ "$eq": [ "$offices": "SC" ] },
]},
1,
0
]}},
"offices": { "$push": "$offices" }
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
Но със сигурност бяхте на прав път. Просто изберете правилната операция за настройка или друг метод, за да получите точните си нужди.
Или тъй като сте публикували своя начин да получите това, което искате, по-добър начин да напишете този вид „подредено съвпадение“ е следният:
db.people.aggregate([
{ "$project": {
"first_name": 1,
"last_name": 1,
"sticky": { "$cond": [
{ "$anyElementTrue": {
"$map": {
"input": "$offices",
"as": "o",
"in": { "$eq": [ "$$o", "FL" ] }
}
}},
2,
{ "$cond": [
{ "$anyElementTrue": {
"$map": {
"input": "$offices",
"as": "o",
"in": { "$eq": [ "$$o", "SC" ] }
}
}},
1,
0
]}
]},
"offices": 1
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
И това ще даде приоритет на документите с „офиси“, съдържащи „FL“ пред „SC“ и следователно пред всички останали, и извършване на операцията в рамките на едно поле. Това също трябва да е много лесно за хората да видят как да абстрахират това във формуляра с помощта на $unwind
в по-ранни версии без операторите set. Където просто предоставяте по-високата стойност на „теглото“ на елементите, които искате в горната част, като влагате $cond
изявления.