1

SQLから来て私はこの検索条件を持っています

WHERE (col1 LIKE "%foo%" OR col2 LIKE "%foo%") AND
      (col1 LIKE "%bar%" OR col2 LIKE "%bar%")

これをMongoDBに変換したいと思います。

私はこれを思いついた、うまくいけば意味的に同一のクエリ:

{
  $and: [
    {
      $or: [
        { col1: /.*foo.*/ },
        { col2: /.*foo.*/ }
      ]
    },
    {
      $or: [
        { col1: /.*bar.*/ },
        { col2: /.*bar.*/ }
      ]
    }
  ]
}

これは正しい方法ですか、それとも改善できますか?
インデックスに関する提案はありますか(使用できる場合)?

4

3 に答える 3

0

はい、それがMongoDBのクエリを実装する正しい方法です。

クエリを完全に支援するインデックスが必要な場合、MongoDBクエリはクエリごとに1つのインデックスしか使用できないため、両方のフィールドを含む複合インデックスである必要があります。したがって、次のようなインデックス:

db.coll.ensureIndex({col1: 1, col2: 1})

を使用して、クエリが期待するインデックスを使用していることを確認できますexplain()

于 2012-11-18T05:12:23.417 に答える
0

ここには3つの問題があります。

  • $and2つの評価されたクエリです
  • $or2つの評価されたクエリです
  • 事前に固定された正規表現はありません

$andは複数のインデックスプランを使用せず、単一のインデックスプランのみを使用しますが、ここで単一の複合インデックスを使用する場合は、それほど役に立ちません。

実際、MongoDBはプレフィックスが付いていないregexにインデックスを使用できないため、インデックスは役に立ちません。

したがって、実際にインデックスを追加しても、このクエリには役に立ちません。

現在の形式でこのクエリを最適化する方法はありません。

通常、このような検索を行う良い方法は、検索している単語を、直接検索してインデックスを作成できる単語のサブドキュメントに分割することです。例については、 http: //www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongoをご覧ください。

これを使用する場合、おそらく単語の配列に1つのインデックスを格納し、それだけです。MongoDBは、クエリ全体でそのインデックスを使用できる必要があります(の場合は2倍$or)。

編集

また、$orあなたが投稿した方法とは異なる作品。

$andと2つは必要ありません$or。必要なのは1つの$または複数の条件のみです。

もう一度編集する

私は$またはすべてを取り出すことにしました。これはインデックスに適さない正規表現を使用しますが、それでも興味深い概念であることに注意してください。

{ col1: /.*(foo|bar).*/ , col2: /.*(bar|foo).*/ }

インデックスに適したものを使用したい場合は、上記のようにクエリの動作を完全に変更する必要があります。

于 2012-11-18T09:52:23.820 に答える
0

andorクエリはさまざまな方法で最適化されます。MongoDBの50のヒントとコツから直接引用:

ヒント#27:AND-クエリはできるだけ速く一致する必要があります

ヒント#28:OR-クエリはできるだけ早く一致する必要があります

したがって、実際のクエリの複雑さと柔軟性に応じて、より一般的なものを作成する必要がfooありますが、両方のステートメントbarの結果を制限するようにしてください。$or

それが役に立てば幸い

于 2012-11-18T11:33:42.873 に答える