MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDb-Suchleistung

Danke für das Posten der Erklärung. Lassen Sie uns die Probleme einzeln angehen.

Erstens glaube ich nicht, dass diese Abfrage das tut, was Sie denken / wollen. Lassen Sie mich Ihnen das am Beispiel der Mongo-Shell zeigen. Ihre in die Shell übersetzte Abfrage lautet

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

Diese Abfrage findet Dokumente, in denen entweder ein Key hat den Wert "ClientId" und einen Value hat den Wert "xxx" oder einen Key hat den Wert "CustomerName" und einen Value der Wert "Jan". Der Schlüssel und der Wert müssen nicht Teil desselben Array-Elements sein . Das folgende Dokument entspricht beispielsweise Ihrer Anfrage

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

Ich vermute, Ihr gewünschtes Verhalten besteht darin, genau die Dokumente abzugleichen, die den Key enthalten und Value im selben Array-Element. Der $elemMatch Operator ist das Werkzeug für den Job:

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

Zweitens glaube ich nicht, dass dieses Schema das ist, wonach Sie suchen. Sie beschreiben Ihren Anwendungsfall nicht, daher kann ich nicht zuversichtlich sein, aber die in diesem Blogbeitrag beschriebene Situation ist eine sehr seltene Situation, in der Sie willkürlich speichern und suchen müssen Schlüssel-Wert-Paare, die sich von einem Dokument zum nächsten ändern können. Dies ist so, als ob Benutzer benutzerdefinierte Metadaten eingeben könnten. Fast keine Anwendung will oder muss dies tun. Es sieht so aus, als ob Ihre Anwendung Informationen über Kunden speichert, wahrscheinlich für ein internes System. Sie sollten in der Lage sein, ein Datenmodell zu definieren für Ihre Kunden sieht das so aus

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

Dies wird die Dinge dramatisch vereinfachen und verbessern. Ich denke, die Drähte haben sich hier gekreuzt, weil die Leute MongoDB manchmal als "schemalos" bezeichnen und der Blogbeitrag von "schemalosen" Dokumenten spricht. Der Blogbeitrag spricht wirklich von schemalosen Dokumenten, bei denen Sie nicht wissen, was dort hineingehen wird. Die meisten Anwendungen sollten ziemlich genau wissen, wie die allgemeine Struktur der Dokumente in einer Sammlung aussehen wird.

Abschließend denke ich, auf dieser Grundlage können wir das Problem mit der langsamen Abfrage vorerst außer Acht lassen. Fühlen Sie sich frei, eine weitere Frage zu stellen oder diese mit einer zusätzlichen Erklärung zu bearbeiten, wenn Sie weitere Hilfe benötigen oder wenn das Problem nicht verschwindet, nachdem Sie berücksichtigt haben, was ich hier gesagt habe.