Vérifier si un champ contient une chaîne

Je cherche un opérateur, ce qui me permet de vérifier si la valeur d’un champ contient une certaine chaîne.

Quelque chose comme:

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

Est-ce possible?

Vous pouvez le faire avec le code suivant.

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

En tant que shell de support Mongo regex, c’est tout à fait possible.

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

Si nous voulons que la requête soit insensible à la casse, nous pouvons utiliser l’option “i”, comme indiqué ci-dessous:

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

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

http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart

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

MySQL

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

MongoDB

 db.users.find({username:/Son/}) 

A partir de la version 2.4, vous pouvez créer un index de texte sur le ou les champs pour rechercher et utiliser l’opérateur $ text pour l’interrogation.

Tout d’abord, créez l’index:

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

Ensuite, pour rechercher:

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

Repères (~ 150K documents):

  • Regex (autres réponses) => 5.6-6.9 secondes
  • Recherche de texte => .164-.201 secondes

Remarques:

  • Une collection ne peut avoir qu’un seul index de texte. Vous pouvez utiliser un index de texte générique si vous souhaitez rechercher un champ de chaîne, comme ceci: db.collection.createIndex( { "$**": "text" } ) .
  • Un index de texte peut être volumineux. Il contient une entrée d’index pour chaque mot post-stemmed unique dans chaque champ indexé pour chaque document inséré.
  • Un index de texte prendra plus de temps à générer qu’un index normal.
  • Un index de texte ne stocke pas de phrases ou d’informations sur la proximité des mots dans les documents. En conséquence, les requêtes de phrase s’exécuteront beaucoup plus efficacement lorsque la collection entière sera stockée dans la mémoire vive.

Voici ce que vous devez faire si vous connectez MongoDB à Python

 db.users.find({"username": {'$regex' : '.*' + 'Son' + '.*'}}) 

Vous pouvez également utiliser un nom de variable au lieu de «Son» et donc la concaténation de chaîne.

Comme il s’agit de l’un des premiers hits dans les moteurs de recherche, et qu’aucune de ces réponses ne semble fonctionner pour MongoDB 3.x, voici une recherche de regex qui fonctionne:

 db.users.find( { 'name' : { '$regex' : yourvalue, '$options' : 'i' } } ) 

Pas besoin de créer et d’index supplémentaire ou similaire.

Manière la plus simple d’accomplir cette tâche

Si vous souhaitez que la requête soit sensible à la casse

 db.getCollection("users").find({'username':/Son/}) 

Si vous souhaitez que la requête soit insensible à la casse

 db.getCollection("users").find({'username':/Son/i}) 

Comment ignorer les balises HTML dans une correspondance RegExp:

 var text = '

The tiger (Panthera tigris) is the largest cat species, most recognizable for its pattern of dark vertical ssortingpes on reddish-orange fur with a lighter underside. The species is classified in the genus Panthera with the lion, leopard, jaguar, and snow leopard. It is an apex predator, primarily preying on ungulates such as deer and bovids.

'; var searchSsortingng = 'largest cat species'; var rx = ''; searchSsortingng.split(' ').forEach(e => { rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)'; }); rx = new RegExp(rx, 'igm'); console.log(text.match(rx));

Ceci est probablement très facile à transformer en filtre d’agrégation MongoDB.