Không thể tái tạo lỗi của bạn nhưng bạn có một vài "lỗi chính tả" trong câu hỏi của mình nên tôi không thể chắc chắn bạn thực sự mắc phải lỗi gì.
Nhưng giả sử bạn thực sự đang làm việc với MongoDB 2.6 trở lên thì bạn có thể muốn có $setIntersection
hoặc $setIsSubset
toán tử thay vì $setUnion
. Các toán tử đó ngụ ý "khớp" nội dung của mảng mà chúng được so sánh với, trong đó $setUnion
chỉ cần kết hợp mảng được cung cấp với mảng hiện có:
db.people.aggregate([
{ "$project": {
"first_name": 1,
"last_name": 1,
"sticky": {
"$size": {
"$setIntersection": [ "$offices", [ "FL", "SC" ]]
}
},
"offices": 1
}},
{ "$sort": {
"sticky": -1,
"last_name": 1
}}
])
Trong các phiên bản trước mà bạn không có đặt toán tử
đó bạn chỉ đang sử dụng $unwind
để làm việc với mảng và cùng một loại $cond
hoạt động như trước trong $group
để mang tất cả trở lại với nhau:
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
}}
])
Nhưng bạn chắc chắn đã đi đúng hướng. Chỉ cần chọn hoạt động được thiết lập phù hợp hoặc phương pháp khác để đáp ứng nhu cầu chính xác của bạn.
Hoặc vì bạn đã đăng theo cách của mình để đạt được những gì bạn muốn, nên cách tốt hơn để viết loại "đối sánh theo thứ tự" đó là:
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
}}
])
Và điều đó sẽ ưu tiên cho nó các tài liệu có "văn phòng" chứa "FL" thay vì "SC" và do đó, sau đó là tất cả các tài liệu khác và thực hiện hoạt động trong một trường duy nhất. Điều đó cũng sẽ rất dễ dàng để mọi người biết cách tóm tắt nó vào biểu mẫu bằng cách sử dụng $unwind
trong các phiên bản trước mà không có các toán tử đã đặt. Nơi bạn chỉ cần cung cấp giá trị "trọng số" cao hơn cho các mục bạn muốn ở trên cùng bằng cách lồng $cond
tuyên bố.