594

フィールドの値に特定の文字列が含まれているかどうかを確認できる演算子を探しています。

何かのようなもの:

db.users.findOne({$contains:{"username":"son"}})

それは可能ですか?

4

15 に答える 15

929

次のコードでそれを行うことができます。

db.users.findOne({"username" : {$regex : "son"}});
于 2012-05-16T10:36:05.377 に答える
216

Mongo シェルは正規表現をサポートしているため、それは完全に可能です。

db.users.findOne({"username" : /.*son.*/});

クエリで大文字と小文字を区別しないようにする場合は、以下に示すように「i」オプションを使用できます。

db.users.findOne({"username" : /.*son.*/i});

参照: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

于 2012-05-16T00:06:56.143 に答える
195

https://docs.mongodb.com/manual/reference/sql-comparison/

http://php.net/manual/en/mongo.sqltomongo.php

MySQL

SELECT * FROM users WHERE username LIKE "%Son%"

モンゴDB

db.users.find({username:/Son/})
于 2012-05-16T03:00:31.100 に答える
89

バージョン 2.4 では、フィールドにテキスト インデックスを作成して検索し、クエリに$text演算子を使用できます。

まず、インデックスを作成します。

db.users.createIndex( { "username": "text" } )

次に、検索するには:

db.users.find( { $text: { $search: "son" } } )

ベンチマーク (~150,000 ドキュメント):

  • 正規表現 (その他の回答) => 5.6-6.9 秒
  • テキスト検索 => .164-.201 秒

ノート:

  • コレクションは、テキスト インデックスを 1 つだけ持つことができます。次のように、任意の文字列フィールドを検索する場合は、ワイルドカード テキスト インデックスを使用できますdb.collection.createIndex( { "$**": "text" } )
  • テキスト インデックスは大きくなる場合があります。これには、挿入された各ドキュメントのインデックス付きフィールドごとに、語幹が付けられた一意の単語ごとに 1 つのインデックス エントリが含まれます。
  • テキスト インデックスは、通常のインデックスよりも構築に時間がかかります。
  • テキスト インデックスには、句やドキュメント内の単語の近接性に関する情報は格納されません。その結果、コレクション全体が RAM に収まると、フレーズ クエリがより効果的に実行されます。
于 2015-06-24T15:34:51.683 に答える
2

集計フレームワークの場合


フィールド検索

('$options': 'i'大文字と小文字を区別しない検索の場合)

db.users.aggregate([
    {
        $match: {
            'email': { '$regex': '@gmail.com', '$options': 'i' }
        }
    }
]);

全文書検索

(テキスト インデックスでインデックス付けされたフィールドでのみ機能します

db.articles.aggregate([
    {
        $match: { $text: { $search: 'brave new world' } }
    }
])
于 2021-02-10T14:06:13.373 に答える