sql >> Database >  >> NoSQL >> MongoDB

MongoDb-zoekprestaties

Bedankt voor het plaatsen van de uitleg. Laten we de problemen één voor één aanpakken.

Ten eerste denk ik niet dat deze query doet wat je denkt dat hij doet/wilt doen. Laat me je een voorbeeld laten zien met behulp van de mongo-schaal. Uw vraag, vertaald in de shell, is

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

Deze zoekopdracht vindt documenten waarin een van de Key heeft de waarde "ClientId" en een aantal Value heeft de waarde "xxx" of een Key heeft de waarde "Klantnaam" en een aantal Value de waarde "Jan". De sleutel en de waarde hoeven geen deel uit te maken van hetzelfde array-element . Het volgende document komt bijvoorbeeld overeen met uw zoekopdracht

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

Ik vermoed dat je gewenste gedrag is om exact overeen te komen met de documenten die de Key . bevatten en Value in hetzelfde array-element. De $elemMatch operator is de tool voor de job:

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

Ten tweede denk ik niet dat dit schema is wat je zoekt. Je beschrijft je use-case niet, dus ik kan er niet zeker van zijn, maar de situatie die in die blogpost wordt beschreven, is een zeer zeldzame situatie waarin je moet opslaan en zoeken op willekeurige sleutel-waardeparen die van het ene document in het andere kunnen veranderen. Dit is hetzelfde als gebruikers aangepaste metadata laten invoeren. Vrijwel geen enkele applicatie wil of hoeft dit te doen. Het lijkt erop dat uw toepassing informatie over klanten opslaat, waarschijnlijk voor een intern systeem. U zou een gegevensmodel moeten kunnen definiëren voor uw klanten die eruitziet als

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

Dit zal de zaken aanzienlijk vereenvoudigen en verbeteren. Ik denk dat de draden hier zijn gekruist omdat mensen MongoDB soms "schemaloos" noemen en de blogpost spreekt over "schemaloze" documenten. De blogpost heeft het echt over schemaloze documenten waarvan je niet weet wat erin gaat. De meeste toepassingen zouden vrijwel precies moeten weten wat de algemene structuur van de documenten in een verzameling zal zijn.

Ten slotte denk ik dat we op basis hiervan het probleem met de trage query voorlopig kunnen negeren. Voel je vrij om nog een vraag te stellen of deze te bewerken met extra uitleg als je meer hulp nodig hebt of als het probleem niet verdwijnt nadat je rekening hebt gehouden met wat ik hier heb gezegd.



  1. MongoDb:vind diep genest object met $lookup

  2. Mongoose vindt er een en duwt naar een reeks documenten

  3. Redis gebruiken als cache voor een mysql-database

  4. Hoe gegevens migreren van MongoDB naar SQL-Server?