MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Ефективност на търсенето в MongoDb

Благодаря, че публикувахте обяснението. Нека разгледаме проблемите един по един.

Първо, не мисля, че тази заявка прави това, което мислите, че прави / искате да прави. Позволете ми да ви покажа чрез пример с помощта на 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 „без схема“, а публикацията в блога говори за „безсхемни“ документи. Публикацията в блога наистина говори за документи без схема, в които не знаете какво ще влезе там. Повечето приложения трябва да знаят почти точно каква ще бъде общата структура на документите в колекция.

И накрая, мисля, че въз основа на това можем да пренебрегнем проблема с бавната заявка за момента. Чувствайте се свободни да зададете друг въпрос или да редактирате този с допълнително обяснение, ако имате нужда от повече помощ или ако проблемът не изчезне, след като сте взели предвид това, което казах тук.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. VersionError:Няма намерен съответстващ документ грешка в Node.js/Mongoose

  2. Как внедрявате автоматично увеличаващ се първичен идентификатор в MongoDB?

  3. OpenSSL не е намерен на MacOS Sierra

  4. Как да стартирам SlaveOk в Mongoose?

  5. Spring-Data mongodb прави заявки за множество класове, съхранени в една и съща колекция