Về cơ bản, tôi đang cố triển khai chức năng nhãn trên mô hình.
> db.event.distinct("thẻ")
[ "thanh", "foo", "foobar" ]
Việc thực hiện một truy vấn riêng biệt đơn giản sẽ truy xuất tất cả các thẻ riêng biệt. Nhưng làm cách nào để có được tất cả các thẻ khác nhau phù hợp với một truy vấn nhất định? Ví dụ, tôi muốn có được foo
tất cả các thẻ phù hợp thì mong đợi nhận được ["foo","foobar"]
kết quả?
Truy vấn sau đây là nỗ lực thất bại của tôi để đạt được điều này:
> db.event.distinct("tags",/foo/)
[ "thanh", "foo", "foobar" ]
> db.event.distinct("tags",{tags: {$regex: 'foo'}})
[ "thanh", "foo", "foobar" ]
khung tổng hợpthay vì .riêng biệt()
命令:
db.event.aggregate([
// Khử chuẩn hóa nội dung mảng thành các tài liệu riêng biệt
{ "$thư giãn": "$tags" },
// Lọc nội dung không chuẩn hóa để loại bỏ nội dung không khớp
{ "$match": { "tags": /foo/ } },
// Nhóm các từ "like" thành "key"
{ "$group": {
"_id": "$tags"
}}
])
Có lẽ tốt hơn hết bạn nên sử dụng " neo " ở đầu biểu thức chính quy, tức là bắt đầu từ "phần đầu" của chuỗi. và cũng làm điều này$match
Xử lý $unwind
Ngoài ra trước đó:
db.event.aggregate([
// So khớp các tài liệu có thể. Luôn là cách tiếp cận tốt nhất.
{ "$match": { "tags": /^foo/ } },
// Khử chuẩn hóa nội dung mảng thành các tài liệu riêng biệt
{ "$thư giãn": "$tags" },
// Bây giờ "lọc" nội dung cho phù hợp thực tế
{ "$match": { "tags": /^foo/ } },
// Nhóm các từ "like" thành "key"
{ "$group": {
"_id": "$tags"
}}
])
Điều này đảm bảo rằng bạn không phải đối phó với $unwind
Trước khi bạn "lọc", chỉ mỗi tài liệu trong bộ sưu tập và những tài liệu có thể chứa giá trị "thẻ khớp" mới được xác thực.
Cách tiếp cận thực sự "tinh vi" giúp giảm thiểu phần nào các mảng lớn có thể khớp đòi hỏi nhiều công việc hơn và là MongoDB 2.6 trở lên:
db.event.aggregate([
{ "$match": { "tags": /^foo/ } },
{ "$project": {
"tags": { "$setDifference": [
{ "$map": {
"đầu vào": "$tags",
"as": "el",
"trong": { "$cond": [
{ "$eq": [
{ "$substr": [ "$$el", 0, 3 ] },
"foo"
]},
"$$el",
SAI
]}
}},
[SAI]
]}
}},
{ "$thư giãn": "$tags" },
{ "$group": { "_id": "$tags" }}
])
所以bản đồ $
là một bộ xử lý mảng "nội tuyến" tốt, nhưng nó chỉ có thể đi xa đến thế. $setSự khác biệt
phủ định toán tử SAI
phù hợp, nhưng cuối cùng bạn vẫn phải đối phó với $unwind
để hoàn thành phần còn lại $group
các giai đoạn để có được các giá trị tổng thể khác nhau.
Ưu điểm ở đây là mảng hiện được "rút gọn" thành chỉ các phần tử "nhãn" phù hợp. Không sử dụng tùy chọn này khi bạn muốn "đếm" số lần xuất hiện của các giá trị "nhiều khác biệt" trong cùng một tài liệu. Nhưng một lần nữa, có nhiều cách khác để giải quyết vấn đề này.
Tôi là một lập trình viên xuất sắc, rất giỏi!