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?
8 réponses
, Vous pouvez le faire avec le code suivant.
db.users.findOne({"username" : {$regex : ".*son.*"}});
Comme le shell Mongo supporte 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 + requêtes#AdvancedQueries-RegularExpressions
Http://www.mongodb.org/display/DOCS/SQL+à + Mongo + cartographie + graphique
Http://php.net/manual/en/mongo.sqltomongo.php
MySQL
SELECT * FROM users WHERE username LIKE "%Son%"
MongoDB
db.users.find({username:/Son/})
Depuis la version 2.4, Vous pouvez créer un text index sur le(s) champ (s) 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
Notes:
- une collection ne peut avoir qu'un seul index de texte. Vous pouvez utiliser un caractère générique index de texte si vous voulez rechercher n'importe quel champ de chaîne, comme ceci:
db.collection.createIndex( { "$**": "text" } )
. - un index de texte peut être grand. Il contient une entrée d'index pour chaque unique post-lexicales, mot dans chaque champ indexé pour chaque document inséré.
- un index de texte prendra plus de temps à construire qu'un index normal.
- un index de texte ne stocke pas de phrases ou d'informations sur la proximité des mots dans les documents. Par conséquent, les requêtes de phrase s'exécuteront beaucoup plus efficacement lorsque l'ensemble la collection tient dans la RAM.
Voici ce que vous devez faire si vous connectez MongoDB via 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.
, c'est l'un des premiers succès dans les moteurs de recherche, et aucun de ce qui précède semble fonctionner pour MongoDB 3.x, voici une recherche regex qui fonctionne:
db.users.find( { 'name' : { '$regex' : yourvalue, '$options' : 'i' } } )
Pas besoin de créer et d'index supplémentaire ou similaire.
Moyen le plus simple d'accomplir cette tâche
Si vous voulez que la requête soit sensible à la casse
db.getCollection("users").find({'username':/Son/})
Si vous voulez que la requête soit casse
db.getCollection("users").find({'username':/Son/i})
Comment ignorer les balises HTML dans une correspondance RegExp:
var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="/wiki/Felidae" title="Felidae">cat</a> <a href="/wiki/Species" title="Species">species</a>, most recognizable for its pattern of dark vertical stripes on reddish-orange fur with a lighter underside. The species is classified in the genus <i><a href="/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="/wiki/Lion" title="Lion">lion</a>, <a href="/wiki/Leopard" title="Leopard">leopard</a>, <a href="/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="/wiki/Deer" title="Deer">deer</a> and <a href="/wiki/Bovid" class="mw-redirect" title="Bovid">bovids</a>.</p>';
var searchString = 'largest cat species';
var rx = '';
searchString.split(' ').forEach(e => {
rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)';
});
rx = new RegExp(rx, 'igm');
console.log(text.match(rx));
C'est probablement très facile à transformer en un filtre D'agrégation MongoDB.