Comprobando si un campo contiene una cadena

Estoy buscando un operador, lo que me permite verificar, si el valor de un campo contiene una cierta cadena.

Algo como:

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

¿Es eso posible?

Puedes hacerlo con el siguiente código.

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

Como Mongo shell support regex, eso es completamente posible.

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

Si queremos que la consulta no distinga entre mayúsculas y minúsculas, podemos usar la opción “i”, como se muestra a continuación:

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

Ver: 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 versión 2.4, puede crear un índice de texto en el (los) campo (s) para buscar y usar el operador $ text para consultar.

Primero, crea el índice:

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

Luego, para buscar:

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

Puntos de referencia (~ 150K documentos):

  • Regex (otras respuestas) => 5.6-6.9 segundos
  • Búsqueda de texto => .164-.201 segundos

Notas:

  • Una colección puede tener solo un índice de texto. Puede utilizar un índice de texto comodín si desea buscar cualquier campo de cadena, como este: db.collection.createIndex( { "$**": "text" } ) .
  • Un índice de texto puede ser grande. Contiene una entrada de índice para cada palabra única post-stemmed en cada campo indexado para cada documento insertado.
  • Un índice de texto tardará más en comstackrse que un índice normal.
  • Un índice de texto no almacena frases o información sobre la proximidad de palabras en los documentos. Como resultado, las consultas de frase se ejecutarán mucho más eficazmente cuando toda la colección se ajuste a la memoria RAM.

Esto es lo que tienes que hacer si estás conectando MongoDB a través de Python

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

también puede usar un nombre de variable en lugar de ‘Son’ y, por lo tanto, la concatenación de cadenas.

Como este es uno de los primeros éxitos en los motores de búsqueda, y ninguno de los anteriores parece funcionar para MongoDB 3.x, aquí hay una búsqueda regex que funciona:

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

No es necesario crear un índice adicional o similar.

La forma más simple de lograr esta tarea

Si desea que la consulta sea sensible a mayúsculas y minúsculas

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

Si desea que la consulta no distinga entre mayúsculas y minúsculas

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

Cómo ignorar las tags HTML en una coincidencia RegExp:

 var text = '

The tiger (Panthera tigris) is the largest cat species, most recognizable for its pattern of dark vertical stripes 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 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));

Esto es probablemente muy fácil de convertir en un filtro de agregación MongoDB.