Je cherche un opérateur qui me permette 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 ?
Je cherche un opérateur qui me permette 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 ?
Notez que cela pas font un usage efficace d'un index et font que toutes les valeurs sont analysées pour trouver des correspondances. Voir les notes sur Expressions régulières
@Stennie, alors que suggérez-vous pour utiliser efficacement l'index et trouver une sous-chaîne.
@Vish : si votre cas d'utilisation courant est la recherche en texte libre d'un champ et que vous disposez d'un grand nombre de documents, je tokeniserais le texte pour des requêtes plus efficaces. Vous pourriez utiliser multikeys pour une simple recherche en texte intégral, ou peut-être construire une indice inversé comme une collection séparée. Pour les recherches peu fréquentes ou une petite collection de documents, le balayage de l'index complet peut constituer une performance acceptable (mais pas optimale).
Comme le shell Mongo supporte les 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#Queries avancées-RegularExpressions
Veuillez inclure un extrait de code démontrant l'utilisation des expressions régulières pour la recherche. Les réponses doivent inclure plus d'informations qu'un simple lien...
La réponse sélectionnée n'a pas fonctionné pour moi, mais celle-ci l'a fait (j'exécute des requêtes mongo via des commandes docker exec). Je pense que celle-ci devrait être la réponse sélectionnée car elle semble être plus polyvalente.
Comme les commentaires dans la réponse choisie, je crois db.users.findOne({"username" : /.*son.*/});
pourrait aussi être exagéré et le regex pourrait simplement être /son/
https://docs.mongodb.com/manual/reference/sql-comparison/
http://php.net/manual/en/mongo.sqltomongo.php
MySQL
SELECT * FROM users WHERE username LIKE "%Son%"
MongoDB
db.users.find({username:/Son/})
Votre réponse concernant MongoDB est bonne ; pensez à modifier votre question pour supprimer les conseils non pertinents concernant MySQL.
Supprimer toute la requête ou la modifier ? La plupart des gens connaissent SQL, c'est utile pour comprendre MongoDB.
@ZhengKai : sur ce site web, vous devez généralement répondre directement à la question, en utilisant uniquement les technologies spécifiques marquées et demandées.
A partir de la version 2.4, vous pouvez créer une indice de texte sur le(s) champ(s) à rechercher et utilisez la fonction Texte pour l'interrogation.
Tout d'abord, créez l'index :
db.users.createIndex( { "username": "text" } )
Ensuite, pour chercher :
db.users.find( { $text: { $search: "son" } } )
Benchmarks (~150K documents) :
Notes :
db.collection.createIndex( { "$**": "text" } )
.
Non, en fait l'opérateur de texte ne permet pas d'exécuter "contient", donc il ne retournera que des mots exacts, la seule option actuellement, à partir de la version 3.0, est d'utiliser une expression rationnelle, c'est-à-dire db.users.find( {username:/son/i } ) qui recherche tous les utilisateurs contenant "son" (cas-insensés).
Comme il s'agit de l'une des premières occurrences dans les moteurs de recherche, et qu'aucune des méthodes ci-dessus ne semble fonctionner pour MongoDB 3.x, voici une recherche regex qui fonctionne :
db.users.find( { 'name' : { '$regex' : yourvalue, '$options' : 'i' } } )
Il n'est pas nécessaire de créer un index supplémentaire ou autre.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.