SQLのクエリで何かをクエリしたいlike
:
SELECT * FROM users WHERE name LIKE '%m%'
MongoDBで同じことをどのように達成できますか?ドキュメントlike
にの演算子が見つかりません。
SQLのクエリで何かをクエリしたいlike
:
SELECT * FROM users WHERE name LIKE '%m%'
MongoDBで同じことをどのように達成できますか?ドキュメントlike
にの演算子が見つかりません。
それは次のようにする必要があります:
db.users.find({"name": /.*m.*/})
または類似:
db.users.find({"name": /m/})
文字列の先頭に「m」が固定されているものではなく、どこかに「m」が含まれているもの(SQLの' %
'演算子は正規表現'''と同等)を探しています。.*
注: MongoDBは、SQLの「LIKE」よりも強力な正規表現を使用します。正規表現を使用すると、想像する任意のパターンを作成できます。
正規表現の詳細については、正規表現(MDN)を参照してください。
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})
したがって:
にとって:
db.users.find({name: /a/}) // Like '%a%'
出力:パウロ、パトリック
にとって:
db.users.find({name: /^pa/}) // Like 'pa%'
出力:パウロ、パトリック
にとって:
db.users.find({name: /ro$/}) //like '%ro'
出力:ペドロ
の
できるよ:
db.users.find({'name': {'$regex': 'sometext'}})
PHPでは、次のコードを使用できます。
$collection->find(array('name'=> array('$regex' => 'm'));
正規表現を使用した文字列検索のさまざまなタイプの要件とソリューションを次に示します。
たとえば、のような単語を含む正規表現を使用できます。また$options => i
、大文字と小文字を区別しない検索に使用できます。
string
db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})
string
ず、正規表現のみdb.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})
string
db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})
string
db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})
string
db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})
正規表現のチートシートをブックマークとして保持し、必要になる可能性のあるその他の変更の参照として使用します。
MongoDBでは、そのための正規表現を使用します。
例えば、
db.users.find({"name": /^m/})
2つの選択肢があります。
db.users.find({"name": /string/})
また
db.users.find({"name": {"$regex": "string", "$options": "i"}})
2つ目は、大文字と小文字を区別せずに検索するオプションの「i」など、より多くのオプションがあります。
また、「文字列」については、「。string。」(%string%)、「string。*」(文字列%)、「。* string)(%string)などを使用できます。通常の文字列を使用できます。あなたが望むように表現。
すでに答えは得られていますが、大文字と小文字を区別しない正規表現と一致させるには、次のクエリを使用できます。
db.users.find ({ "name" : /m/i } ).pretty()
は大文字と小文字を区別しないことを示しi
、よりきれいな出力を提供します。/m/i
.pretty()
Node.jsのMongooseの場合:
db.users.find({'name': {'$regex': '.*sometext.*'}})
MongoDB2.6の新機能を使用できます。
db.foo.insert({desc: "This is a string with text"});
db.foo.insert({desc:"This is a another string with Text"});
db.foo.ensureIndex({"desc":"text"});
db.foo.find({
$text:{
$search:"text"
}
});
Node.jsプロジェクトで、Mongooseを使用して、次のようなクエリを使用します。
var User = mongoose.model('User');
var searchQuery = {};
searchQuery.email = req.query.email;
searchQuery.name = {$regex: req.query.name, $options: 'i'};
User.find(searchQuery, function(error, user) {
if(error || user === null) {
return res.status(500).send(error);
}
return res.status(200).send(user);
});
whereステートメントを使用して、JavaScriptスクリプトを作成できます。
db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );
参照:$ where
MongoDB Compassでは、次のように厳密モードの構文を使用する必要があります。
{ "text": { "$regex": "^Foo.*", "$options": "i" } }
(MongoDB Compassでは、"
代わりにを使用することが重要です'
)
Goとmgoドライバーの場合:
Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)
ここで、結果は、求められている型のstructインスタンスです。
PHPモンゴのように。
PHPmongoでいくつかの問題が発生しました。正規表現パラメーターを連結すると、状況によっては役立つことがわかりました。PHPmongoの検索フィールドは。で始まります。
例えば、
db()->users->insert(['name' => 'john']);
db()->users->insert(['name' => 'joe']);
db()->users->insert(['name' => 'jason']);
// starts with
$like_var = 'jo';
$prefix = '/^';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john)
// contains
$like_var = 'j';
$prefix = '/';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john, jason)
変数でテンプレートリテラルを使用することも機能します。
{"firstname": {$regex : `^${req.body.firstname}.*` , $options: 'si' }}
SQLでは、「<strong>like」クエリは次のようになります。
select * from users where name like '%m%'
MongoDBコンソールでは、次のようになります。
db.users.find({"name": /m/}) // Not JSON formatted
db.users.find({"name": /m/}).pretty() // JSON formatted
さらに、このpretty()
メソッドは、より読みやすいすべての場所でフォーマットされたJSON構造を生成します。
正規表現の処理にはコストがかかります。
もう1つの方法は、テキストのインデックスを作成し、を使用してそれを検索すること$search
です。
検索可能にするフィールドのテキストインデックスを作成します。
db.collection.createIndex({name: 'text', otherField: 'text'});
テキストインデックスで文字列を検索します。
db.collection.find({
'$text'=>{'$search': "The string"}
})
文字列yourdb={deepakparmar、dipak、parmar}
db.getCollection('yourdb').find({"name":/^dee/})
ans deepakparmar
db.getCollection('yourdb').find({"name":/d/})
ans deepakparmar、dipak
db.getCollection('yourdb').find({"name":/mar$/})
ans deepakparmar、parmar
以下のように一致する正規表現を使用します。「i」は大文字と小文字を区別しないことを示します。
var collections = mongoDatabase.GetCollection("Abcd");
var queryA = Query.And(
Query.Matches("strName", new BsonRegularExpression("ABCD", "i")),
Query.Matches("strVal", new BsonRegularExpression("4121", "i")));
var queryB = Query.Or(
Query.Matches("strName", new BsonRegularExpression("ABCD","i")),
Query.Matches("strVal", new BsonRegularExpression("33156", "i")));
var getA = collections.Find(queryA);
var getB = collections.Find(queryB);
/regex_pattern/
JavaScriptパターンとMongoDBパターンの両方を使用する理由があるようです{'$regex': 'regex_pattern'}
。参照:MongoDBRegEx構文の制限
これは完全な正規表現のチュートリアルではありませんが、上記の非常に投票されたあいまいな投稿を見て、これらのテストを実行するように促されました。
> ['abbbb','bbabb','bbbba'].forEach(function(v){db.test_collection.insert({val: v})})
> db.test_collection.find({val: /a/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }
> db.test_collection.find({val: /.*a.*/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }
> db.test_collection.find({val: /.+a.+/})
{ "val" : "bbabb" }
> db.test_collection.find({val: /^a/})
{ "val" : "abbbb" }
> db.test_collection.find({val: /a$/})
{ "val" : "bbbba" }
> db.test_collection.find({val: {'$regex': 'a$'}})
{ "val" : "bbbba" }
同様のクエリは次のようになります。
db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);
Scala ReactiveMongo APIの場合、
val query = BSONDocument("title" -> BSONRegex(".*" + name + ".*", "")) // like
val sortQ = BSONDocument("regularizedCorRelation" -> BSONInteger(1))
val cursor = collection.find(query).sort(sortQ).options(QueryOpts().batchSize(10)).cursor[BSONDocument]
Spring-Data MongoDBを使用している場合は、次の方法で実行できます。
String tagName = "m";
Query query = new Query();
query.limit(10);
query.addCriteria(Criteria.where("tagName").regex(tagName));
文字列変数がある場合は、それを正規表現に変換する必要があるため、MongoDBはそれに同様のステートメントを使用します。
const name = req.query.title; //John
db.users.find({ "name": new Regex(name) });
次と同じ結果です:
db.users.find({"name": /John/})
MongoDBシェルは正規表現をサポートしているため、それは完全に可能です。
db.users.findOne({"name" : /.*sometext.*/});
クエリで大文字と小文字を区別しないようにする場合は、次のように「i」オプションを使用できます。
db.users.findOne({"name" : /.*sometext.*/i});
MongoDBで「like」検索が必要な場合は、$regexを使用する必要があります。これを使用すると、クエリは次のようになります。
db.product.find({name:{$regex:/m/i}})
詳細については、ドキュメントも読むことができます- $ regex
集計部分文字列検索を使用します(インデックス付き!!!):
db.collection.aggregate([{
$project : {
fieldExists : {
$indexOfBytes : ['$field', 'string']
}
}
}, {
$match : {
fieldExists : {
$gt : -1
}
}
}, {
$limit : 5
}
]);
MongoRegexは非推奨になりました。
MongoDB \ BSON\Regexを使用します。
$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor
使用する:
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()
文字列パターンを検索するときは、大文字と小文字がわからない場合と同様に、上記のパターンを使用することをお勧めします。
正規表現でクエリできます。
db.users.find({"name": /m/});
文字列がユーザーからのものである場合は、使用する前に文字列をエスケープすることをお勧めします。これにより、ユーザーからのリテラル文字が正規表現トークンとして解釈されるのを防ぐことができます。
たとえば、文字列「A」を検索します。エスケープされていない場合も「AB」と一致します。文字列を使用する前に、単純なreplace
文字列をエスケープすることができます。私はそれを再利用するための関数にしました:
function textLike(str) {
var escaped = str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
return new RegExp(escaped, 'i');
}
これで、文字列は大文字と小文字を区別しないパターンになり、リテラルドットにも一致します。例:
> textLike('A.');
< /A\./i
これで、外出先で正規表現を生成する準備が整いました。
db.users.find({ "name": textLike("m") });
同様のクエリと同等の結果を見つける1つの方法:
db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})
i
大文字と小文字を区別しないフェッチデータに使用される場所。
結果を得る別の方法:
db.collection.find({"name":/aus/})
上記は、ausを含む名前にausを含む結果を提供します。
使用する:
const indexSearch = await UserModel.find(
{ $text: { $search: filter } },
);
if (indexSearch.length) {
return indexSearch;
}
return UserModel.find(
{
$or: [
{ firstName: { $regex: `^${filter}`, $options: 'i' } },
{ lastName: { $regex: `^${filter}`, $options: 'i' } },
{ middleName: { $regex: `^${filter}`, $options: 'i' } },
{ email: { $regex: `^${filter}`, $options: 'i' } },
],
},
);
正規表現と「インデックス」を組み合わせて使用しました。
MySQLクエリをMongoDBに変換するための無料のツールを見つけました: http ://www.querymongo.com/
いくつかのクエリで確認しました。私が見ているように、それらのほとんどすべてが正しいです。それによると、答えは
db.users.find({
"name": "%m%"
});
これを実現するにはさまざまな方法があります。
最も単純なもの:
db.users.find({"name": /m/})
{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }
db.users.find({ "name": { $regex: "m"} })
詳細については、$regexを参照してください。
name
文字列をスペースで分割し、単語の配列を作成しますlet name = "My Name".split(" ").map(n => new RegExp(n));
console.log(name);
結果:
[/My/, /Name/]
文字列に一致するシナリオは2つあります。
$in
:(状態 に似てい$or
ます)式で$を試してください。クエリ式に正規表現を含めるには、$in
JavaScriptの正規表現オブジェクト(つまり、/pattern/
)のみを使用できます。例えば:
db.users.find({ name: { $in: name } }); // name = [/My/, /Name/]
$all
:(条件 に似てい$and
ます)ドキュメントにはすべての単語が含まれている必要がありますdb.users.find({ name: { $all: name } }); // name = [/My/, /Name/]
$and
と$or
条件を使用して$regex
文字列に一致するシナリオは2つあります。
$or
:(状態 に似てい$in
ます)db.users.find({
$or: [
{ name: { $regex: "My" } },
{ name: { $regex: "Name" } }
// if you have multiple fields for search then repeat same block
]
})
$and
:(条件 に似てい$all
ます)ドキュメントにはすべての単語が含まれている必要がありますdb.users.find({
$and: [
{
$and: [
{ name: { $regex: "My" } },
{ name: { $regex: "Name" } }
]
}
// if you have multiple fields for search then repeat same block
]
})
PHPを使用している場合は、次のようにMongoDB_DataObjectラッパーを使用できます。
$model = new MongoDB_DataObject();
$model->query("select * from users where name like '%m%'");
while($model->fetch()) {
var_dump($model);
}
または:
$model = new MongoDB_DataObject('users);
$model->whereAdd("name like '%m%'");
$model->find();
while($model->fetch()) {
var_dump($model);
}
2つの日付の間にstatus=='Pending'がある'last'のようなFullName:
db.orders.find({
createdAt:{$gt:ISODate("2017-04-25T10:08:16.111Z"),
$lt:ISODate("2017-05-05T10:08:16.111Z")},
status:"Pending",
fullName:/last/}).pretty();
status =='Pending'およびorderIdLIKE'PHA876174':
db.orders.find({
status:"Pending",
orderId:/PHA876174/
}).pretty();
Goドライバーの場合:
filter := bson.M{
"field_name": primitive.Regex{
Pattern: keyword,
Options: "",
},
}
cursor, err := GetCollection().Find(ctx, filter)
$ inクエリで正規表現を使用します(MongoDBドキュメント:$ in):
filter := bson.M{
"field_name": bson.M{
"$in": []primitive.Regex{
{
Pattern: keyword,
Options: "",
},
}
}
}
cursor, err := GetCollection().Find(ctx, filter)
MongoDbでは、 MongoDb参照演算子の正規表現(regex)を使用するのと同じように使用できます。
同じ例の場合
MySQL - SELECT * FROM users WHERE name LIKE '%m%'
MongoDb
1) db.users.find({ "name": { "$regex": "m", "$options": "i" } })
2) db.users.find({ "name": { $regex: new RegExp("m", 'i') } })
3) db.users.find({ "name": { $regex:/m/i } })
4) db.users.find({ "name": /mail/ })
5) db.users.find({ "name": /.*m.*/ })
MySQL - SELECT * FROM users WHERE name LIKE 'm%'
MongoDb Any of Above with /^String/
6) db.users.find({ "name": /^m/ })
MySQL - SELECT * FROM users WHERE name LIKE '%m'
MongoDb Any of Above with /String$/
7) db.users.find({ "name": /m$/ })
>> db.car.distinct('name')
[ "honda", "tat", "tata", "tata3" ]
>> db.car.find({"name":/. *ta.* /})
次のようにワイルドカードフィルターを使用することもできます。
{"query": { "wildcard": {"lookup_field":"search_string*"}}}
必ず使用してください*
。
「startswith」パラダイムを使用するコマンドは次のとおりです。
db.customer.find({"customer_name" : { $regex : /^startswith/ }})
念のため、誰かが文字列の代わりに文字列の配列を保持するキーのSQLLIKEの種類のクエリを探しています。これは次のとおりです。
db.users.find({"name": {$in: [/.*m.*/]}})
以前の回答は、コアMongoDBクエリに関する質問に完全に答えています。ただし、次のようなパターンベースの検索クエリを使用する場合:
{"keywords":{"$ regex":"^toron。*"}}
また
{"keywords":{"$ regex": "^ toron"}}
@Queryアノテーションを使用したSpringBootJPAリポジトリクエリでは、次のようなクエリを使用します。
@Query(value = "{ keyword : { $regex : ?0 } }")
List<SomeResponse> findByKeywordContainingRegex(String keyword);
そして、呼び出しは次のいずれかである必要があります。
List<SomeResponse> someResponseList = someRepository.findByKeywordsContainingRegex("^toron");
List<SomeResponse> someResponseList = someRepository.findByKeywordsContainingRegex("^toron.*");
ただし、使用しないでください。
List<SomeResponse> someResponseList = someRepository.findByKeywordsContainingRegex("/^toron/");
List<SomeResponse> someResponseList =someRepository.findByKeywordsContainingRegex("/^toron.*/");
注意すべき重要なポイント: @Queryステートメントの?0フィールドが二重引用符で囲まれた文字列に置き換えられるたびに。したがって、これらの場合、フォワードスラッシュ(/)は使用しないでください。検索パターンでは常に二重引用符を使用してパターンを探してください!! たとえば、"^toron" or "^toron.*"
/^toron/ or /^toron.*/