sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDb sökprestanda

Tack för att du postade förklaringen. Låt oss ta itu med problemen ett i taget.

För det första tror jag inte att den här frågan gör vad du tror att den gör/vill att den ska göra. Låt mig visa dig med exempel genom att använda mongoskalet. Din fråga, översatt till skalet, är

{ "$or" : [
    { "$and" : [
        { "SearchTerms.Key" : "ClientId" }, 
        { "SearchTerms.Value" : "xxx" }
    ]},
    { "$and" : [
        { "SearchTerms.Key" : "CustomerName" },     
        { "SearchTerms.Value" : "Jan" }
    ]}
]}

Denna fråga hittar dokument där antingen någon Key har värdet "ClientId" och något Value har värdet "xxx" eller någon Key har värdet "CustomerName" och ett visst Value värdet "Jan". Nyckeln och värdet behöver inte vara en del av samma matriselement . Till exempel, följande dokument matchar din fråga

{ "SearchTerms" : [
        { "Key" : "ClientId", "Value" : 691 }, 
        { "Key" : "banana", "Value" : "xxx" }
    ]
}

Jag antar att ditt önskade beteende är att matcha exakt de dokument som innehåller Key och Value i samma array-element. $elemMatch operatör är verktyget för jobbet:

{ "$or" : [
    { "SearchTerms" : { "$elemMatch" : { "Key" : "ClientId", "Value" : "xxx" } } },
    { "SearchTerms" : { "$elemMatch" : { "Key" : "CustomerName", "Value" : "Jan" } } }
]}

För det andra, jag tror inte att det här schemat är vad du letar efter. Du beskriver inte ditt användningsfall så jag kan inte vara säker, men situationen som beskrivs i det blogginlägget är en mycket sällsynt situation där du behöver lagra och söka på godtyckligt nyckel-värdepar som kan ändras från ett dokument till ett annat. Det är som att låta användare lägga in anpassad metadata. Nästan inga applikationer vill eller behöver göra detta. Det ser ut som att din applikation lagrar information om kunder, förmodligen för ett internt system. Du bör kunna definiera en datamodell för dina kunder som ser ut som

{
    "CustomerId" : 1234,
    "CustomerName" : "Jan",
    "ClientId" : "xpj1234",
    ...
}

Detta kommer att förenkla och förbättra saker dramatiskt. Jag tror att trådarna gick i kors här eftersom folk ibland kallar MongoDB för "schemalösa" och blogginlägget talar om "schemalösa" dokument. Blogginlägget talar verkligen om schemalösa dokument där man inte vet vad som ska in där. De flesta applikationer bör veta ganska exakt vad den allmänna strukturen för dokumenten i en samling kommer att vara.

Slutligen tror jag att vi på grundval av detta kan bortse från problemet med den långsamma frågan för tillfället. Ställ gärna en annan fråga eller redigera denna med extra förklaring om du behöver mer hjälp eller om problemet inte försvinner när du har tagit hänsyn till det jag har sagt här.



  1. Ställ in Mongo Timeout i Spring Boot

  2. 'TypeError:meme.find(...).forEach är inte en funktion' i mongoose node js?

  3. GeoLocation API Anropar mot ett EVE RESTful API

  4. hur man beräknar medelvärde, median, min, max i mongodb-fråga?