Благодаря, че публикувахте обяснението. Нека разгледаме проблемите един по един.
Първо, не мисля, че тази заявка прави това, което мислите, че прави / искате да прави. Позволете ми да ви покажа чрез пример с помощта на mongo shell. Вашата заявка, преведена в обвивката, е
{ "$or" : [
{ "$and" : [
{ "SearchTerms.Key" : "ClientId" },
{ "SearchTerms.Value" : "xxx" }
]},
{ "$and" : [
{ "SearchTerms.Key" : "CustomerName" },
{ "SearchTerms.Value" : "Jan" }
]}
]}
Тази заявка намира документи, където или някакъв Key
има стойността "ClientId" и някаква Value
има стойността "xxx" или някакъв Key
има стойността "CustomerName" и някаква Value
стойността "Ян". Не е необходимо ключът и стойността да са част от един и същ елемент на масив . Например, следният документ отговаря на вашата заявка
{ "SearchTerms" : [
{ "Key" : "ClientId", "Value" : 691 },
{ "Key" : "banana", "Value" : "xxx" }
]
}
Предполагам, че желаното от вас поведение е да съответства точно на документите, които съдържат Key
и Value
в същия елемент на масива. $elemMatch
operator е инструментът за работата:
{ "$or" : [
{ "SearchTerms" : { "$elemMatch" : { "Key" : "ClientId", "Value" : "xxx" } } },
{ "SearchTerms" : { "$elemMatch" : { "Key" : "CustomerName", "Value" : "Jan" } } }
]}
Второ, не мисля, че тази схема е това, което търсите. Вие не описвате вашия случай на употреба, така че не мога да бъда уверен, но ситуацията, описана в тази публикация в блога, е много рядка ситуация, при която трябва да съхранявате и търсите в произволно двойки ключ-стойност, които могат да се променят от един документ към следващия. Това е като да позволите на потребителите да въвеждат персонализирани метаданни. Почти нито едно приложение не иска или не трябва да прави това. Изглежда, че вашето приложение съхранява информация за клиенти, вероятно за вътрешна система. Трябва да можете да дефинирате модел на данни за вашите клиенти, което изглежда така
{
"CustomerId" : 1234,
"CustomerName" : "Jan",
"ClientId" : "xpj1234",
...
}
Това ще опрости и подобри драстично нещата. Мисля, че тук се разминаха проблемите, защото понякога хората наричат MongoDB „без схема“, а публикацията в блога говори за „безсхемни“ документи. Публикацията в блога наистина говори за документи без схема, в които не знаете какво ще влезе там. Повечето приложения трябва да знаят почти точно каква ще бъде общата структура на документите в колекция.
И накрая, мисля, че въз основа на това можем да пренебрегнем проблема с бавната заявка за момента. Чувствайте се свободни да зададете друг въпрос или да редактирате този с допълнително обяснение, ако имате нужда от повече помощ или ако проблемът не изчезне, след като сте взели предвид това, което казах тук.