Cảm ơn đã đăng giải thích. Hãy giải quyết từng vấn đề một.
Đầu tiên, tôi không nghĩ rằng truy vấn này làm những gì bạn nghĩ nó làm / muốn nó làm. Hãy để tôi cho bạn thấy bằng cách sử dụng trình bao mongo. Truy vấn của bạn, được dịch sang shell, là
{ "$or" : [
{ "$and" : [
{ "SearchTerms.Key" : "ClientId" },
{ "SearchTerms.Value" : "xxx" }
]},
{ "$and" : [
{ "SearchTerms.Key" : "CustomerName" },
{ "SearchTerms.Value" : "Jan" }
]}
]}
Truy vấn này tìm các tài liệu có một số Key
có giá trị "ClientId" và một số Value
có giá trị "xxx" hoặc một số Key
có giá trị "CustomerName" và một số Value
giá trị "Jan". Khóa và giá trị không cần phải là một phần của cùng một phần tử mảng . Ví dụ:tài liệu sau phù hợp với truy vấn của bạn
{ "SearchTerms" : [
{ "Key" : "ClientId", "Value" : 691 },
{ "Key" : "banana", "Value" : "xxx" }
]
}
Tôi đoán hành vi mong muốn của bạn là khớp chính xác các tài liệu có chứa Key
và Value
trong cùng một phần tử mảng. $elemMatch
toán tử là công cụ cho công việc:
{ "$or" : [
{ "SearchTerms" : { "$elemMatch" : { "Key" : "ClientId", "Value" : "xxx" } } },
{ "SearchTerms" : { "$elemMatch" : { "Key" : "CustomerName", "Value" : "Jan" } } }
]}
Thứ hai, tôi không nghĩ rằng lược đồ này là những gì bạn đang tìm kiếm. Bạn không mô tả trường hợp sử dụng của mình nên tôi không thể tự tin, nhưng tình huống được mô tả trong bài đăng trên blog đó là một tình huống rất hiếm khi bạn cần lưu trữ và tìm kiếm trên tùy ý các cặp khóa-giá trị có thể thay đổi từ tài liệu này sang tài liệu tiếp theo. Điều này giống như cho phép người dùng đưa siêu dữ liệu tùy chỉnh vào. Hầu như không có ứng dụng nào muốn hoặc không cần phải làm điều này. Có vẻ như ứng dụng của bạn đang lưu trữ thông tin về khách hàng, có thể là cho một hệ thống nội bộ. Bạn có thể xác định mô hình dữ liệu cho khách hàng của bạn giống như
{
"CustomerId" : 1234,
"CustomerName" : "Jan",
"ClientId" : "xpj1234",
...
}
Điều này sẽ đơn giản hóa và cải thiện mọi thứ một cách đáng kể. Tôi nghĩ rằng các dây đã được vượt qua ở đây vì đôi khi mọi người gọi MongoDB là "schemaless" và bài đăng trên blog nói về các tài liệu "schemaless". Bài đăng trên blog thực sự đang nói về các tài liệu không có chất lỏng mà bạn không biết điều gì sẽ diễn ra trong đó. Hầu hết các ứng dụng sẽ biết khá nhiều chính xác cấu trúc chung của các tài liệu trong một bộ sưu tập.
Cuối cùng, tôi nghĩ rằng trên cơ sở này, chúng ta có thể bỏ qua vấn đề với truy vấn chậm ngay bây giờ. Vui lòng đặt một câu hỏi khác hoặc chỉnh sửa câu hỏi này kèm theo lời giải thích thêm nếu bạn cần thêm trợ giúp hoặc nếu vấn đề không biến mất khi bạn đã tính đến những gì tôi đã nói ở đây.