sql >> データベース >  >> NoSQL >> MongoDB

MongoDb検索パフォーマンス

    説明を投稿していただきありがとうございます。一度に1つずつ問題に対処しましょう。

    まず、このクエリは、あなたが思っていることや実行したいことを実行するとは思いません。例として、mongoシェルを使用して説明します。シェルに翻訳されたクエリは

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

    このクエリは、Keyのいずれかが含まれるドキュメントを検索します 値は「ClientId」で、いくつかのValue 値が「xxx」またはKey 値は「CustomerName」で、Valueがいくつかあります。 値「Jan」。 キーと値は同じ配列要素の一部である必要はありません 。たとえば、次のドキュメントはクエリと一致します

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

    Keyを含むドキュメントと完全に一致することが望ましい動作だと思います およびValue 同じ配列要素内。 $elemMatch 演算子は仕事のためのツールです:

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

    第二に、私はこのスキーマがあなたが探しているものではないと思います。ユースケースについて説明していないため、自信が持てませんが、そのブログ投稿で説明されている状況は、任意ので保存および検索する必要がある非常にまれな状況です。 あるドキュメントから次のドキュメントに変更できるキーと値のペア。これは、ユーザーがカスタムメタデータを入力できるようにするようなものです。これを実行する必要のあるアプリケーションはほとんどありません。アプリケーションは、おそらく内部システムのために、顧客に関する情報を保存しているようです。 データモデル を定義できるはずです。 のように見えるあなたの顧客のために

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

    これにより、物事が劇的に簡素化および改善されます。時々人々がMongoDBを「スキーマレス」と呼び、ブログ投稿が「スキーマレス」ドキュメントについて話しているので、ここでワイヤーが交差したと思います。ブログの投稿は、実際には、そこに何が入るのかわからないスキーマレスドキュメントについて話している。ほとんどのアプリケーションは、コレクション内のドキュメントの一般的な構造がどのようなものになるかをほぼ正確に知っている必要があります。

    最後に、これに基づいて、今のところ遅いクエリの問題を無視できると思います。さらにヘルプが必要な場合、またはここで述べたことを考慮しても問題が解決しない場合は、別の質問をするか、追加の説明を付けてこの質問を編集してください。



    1. MongoDBのネストされたクエリは、最後に発生した結果のみを返します

    2. phpredisのmulti()呼び出し内の各呼び出しは、redisへの新しいネットワークラウンドトリップになりますか?

    3. WindowsでMongoDBを起動する際の問題

    4. Redis統計