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?

288
demandé sur Bjorn Tipling 2012-05-16 03:20:23

8 réponses

, Vous pouvez le faire avec le code suivant.

db.users.findOne({"username" : {$regex : ".*son.*"}});
461
répondu Parvin Gasimzade 2012-05-16 10:36:05

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

137
répondu James Gan 2012-05-16 22:45:29

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/})
91
répondu Zheng Kai 2012-05-16 05:20:08

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.
55
répondu okoboko 2015-06-24 15:34:51

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.

15
répondu Patthebug 2013-11-15 06:30:27

, 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.

14
répondu Nitai 2016-12-15 06:10:14

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})
6
répondu Anurag Misra 2017-08-29 10:24:00

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.

0
répondu Tamás Polgár 2018-05-26 03:56:14