Je veux interroger quelque chose avec la requête like
de SQL:
SELECT * FROM users WHERE name LIKE '%m%'
Comment faire la même chose dans MongoDB? Je ne trouve pas d'opérateur pour like
dans documentation .
Cela devrait être:
db.users.find({"name": /.*m.*/})
ou similaire:
db.users.find({"name": /m/})
Vous recherchez quelque chose qui contient "m" quelque part (l'opérateur '%
' de SQL équivaut à '.*
' de Regexp), et non quelque chose qui a un "m" ancré au début de la chaîne.
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})
db.users.find({name: /a/}) //like '%a%'
out: paulo, patric
db.users.find({name: /^pa/}) //like 'pa%'
out: paulo, patric
db.users.find({name: /ro$/}) //like '%ro'
out: pedro
Dans
tu peux faire:
db.users.find({'name': {'$regex': 'sometext'}})
En PHP, vous pouvez utiliser le code suivant:
$collection->find(array('name'=> array('$regex' => 'm'));
Vous utiliseriez regex pour cela en mongo.
par exemple: db.users.find({"name": /^m/})
Il y a déjà beaucoup de réponses. Je donne différents types d'exigences et de solutions pour la recherche de chaînes avec regex.
Vous pouvez faire avec regex qui contiennent Word i.e like. Vous pouvez aussi utiliser $options => i
pour une recherche insensible à la casse.
Contient string
db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})
Ne contient pas string
seulement avec regex
db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})
Insensible à la casse exacte string
db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})
Commencez par string
db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})
Terminez avec string
db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})
Conservez this en tant que signet et référence pour toute autre modification dont vous pourriez avoir besoin.
Vous avez 2 choix:
db.users.find({"name": /string/})
ou
db.users.find({"name": {"$regex": "string", "$options": "i"}})
Sur le second, vous avez plus d'options, comme "i" dans les options pour rechercher en utilisant la casse. Et à propos de la "chaîne", vous pouvez utiliser comme ".chaîne." (% chaîne%), ou "chaîne. *" (Chaîne%) et ". * Chaîne) (% chaîne) pour Vous pouvez utiliser l’expression régulière à votre guise.
Prendre plaisir!
Déjà, vous avez les réponses, mais pour faire correspondre regex avec insensibilité à la casse
Vous pouvez utiliser la requête suivante
db.users.find ({ "name" : /m/i } ).pretty()
La i
dans le /m/i
indique l'insensibilité à la casse et .pretty()
fournit un résultat plus joli.
Pour Mongoose dans Node.js
db.users.find({'name': {'$regex': '.*sometext.*'}})
Vous pouvez utiliser la nouvelle fonctionnalité de 2.6 mongodb:
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"
}
});
Pour PHP mongo Like.
J'ai eu plusieurs problèmes avec php mongo like. J'ai trouvé que concaténer les paramètres regex aide dans certaines situations le champ de recherche de PHP commence par . Je pensais que je posterais ici pour contribuer au fil plus populaire
par exemple
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)
Dans nodejs projetez et utilisez mangouste utilisez comme une requête
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);
});
Avec MongoDB Compass, vous devez utiliser la syntaxe de mode strict, comme suit:
{ "text": { "$regex": "^Foo.*", "$options": "i" } }
(Dans MongoDB Compass, il est important d’utiliser "
au lieu de '
.)
En SQL, la requête "like" ressemble à ceci:
select * from users where name like '%m%'
Dans la console MongoDB, cela ressemble à ceci:
db.users.find({"name": /m/}) // Not JSON formatted
db.users.find({"name": /m/}).pretty() // JSON formatted
De plus, la méthode pretty()
générera dans tous les endroits où la structure JSON formatée est plus lisible.
Les regex coûtent cher sont un processus.
Une autre méthode consiste à créer un index de texte, puis à le rechercher à l'aide de $search
.
Créez un index textuel des champs que vous souhaitez rendre consultables:
db.collection.createIndex({name: 'text', otherField: 'text'});
Rechercher une chaîne dans l'index de texte:
db.collection.find({
'$text'=>{'$search': "The string"}
})
Utilisez les expressions régulières correspondantes comme ci-dessous. Le 'i' montre une insensibilité à la casse.
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);
Dans Go et le pilote mgo:
Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)
où result est l'instance de struct du type recherché
Vous pouvez utiliser l'instruction where pour construire n'importe quel script JS:
db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );
Référence: http://docs.mongodb.org/manual/reference/operator/where/
Il semble qu'il y ait des raisons d'utiliser à la fois le motif javascript /regex_pattern/
ainsi que le motif mongo {'$regex': 'regex_pattern'}
. Voir: Restrictions de la syntaxe MongoBD RegEx
Ce n'est pas un tutoriel complet sur RegEx, mais j'ai été inspiré pour exécuter ces tests après avoir vu un post très ambigu sur les votes hautement ambigu) .
> ['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" }
Like Query serait comme indiqué ci-dessous
db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);
pour 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]
Si vous utilisez Spring-Data Mongodb, vous pouvez procéder de la manière suivante:
String tagName = "m";
Query query = new Query();
query.limit(10);
query.addCriteria(Criteria.where("tagName").regex(tagName));
En tant que support regex de Mongo Shell, c'est tout à fait possible.
db.users.findOne({"name" : /.*sometext.*/});
Si nous voulons que la requête ne respecte pas la casse, nous pouvons utiliser l'option "i", comme illustré ci-dessous:
db.users.findOne({"name" : /.*sometext.*/i});
Si vous voulez une recherche 'J'aime' dans Mongo, alors vous devriez utiliser $ regex en utilisant cette requête
db.product.find({name:{$regex:/m/i}})
pour plus d'informations, vous pouvez également lire la documentation. https://docs.mongodb.com/manual/reference/operator/query/regex/
L'utilisation de littéraux de modèle avec des variables fonctionne également:
{"firstname": {$regex : `^${req.body.firstname}.*` , $options: 'si' }}
J'ai trouvé un outil gratuit pour traduire les requêtes MYSQL en MongoDB. http://www.querymongo.com/ J'ai vérifié avec plusieurs requêtes. comme je vois presque tous sont corrects. D'après cela, la réponse est
db.users.find({
"name": "%m%"
});
Utilisez la recherche de sous-chaînes d'agrégation (avec index !!!):
db.collection.aggregate([{
$project : {
fieldExists : {
$indexOfBytes : ['$field', 'string']
}
}
}, {
$match : {
fieldExists : {
$gt : -1
}
}
}, {
$limit : 5
}
]);
MongoRegex est obsolète.
Utiliser 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()
Lorsque nous recherchons des modèles de chaîne, il est toujours préférable d'utiliser le modèle ci-dessus, car nous ne sommes pas sûrs de la casse. J'espère que ça t'as aidé!!!
FullName comme 'last' avec le statut == 'En attente ’entre deux dates:
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 == 'En attente' et orderId LIKE 'PHA876174':
db.orders.find({
status:"Pending",
orderId:/PHA876174/
}).pretty();
Si vous utilisez PHP, vous pouvez utiliser MongoDB_DataObject comme ci-dessous:
$model = new MongoDB_DataObject();
$model->query("select * from users where name like '%m%'");
while($model->fetch()) {
var_dump($model);
}
OU:
$model = new MongoDB_DataObject('users);
$model->whereAdd("name like '%m%'");
$model->find();
while($model->fetch()) {
var_dump($model);
}
>> db.car.distinct('name')
[ "honda", "tat", "tata", "tata3" ]
>> db.car.find({"name":/. *ta.* /})
Vous pouvez également utiliser le filtre générique comme suit:
{"query": { "wildcard": {"lookup_field":"search_string*"}}}
assurez-vous d'utiliser *
.
String 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, dipak, parmar