Como interrogar o MongoDB com "gostar"?

quero perguntar algo como a consulta do SQL like:

select * 
from users 
where name like '%m%'
Como fazer o mesmo em MongoDB?
Não consigo encontrar um operador para like nas documentações.

Author: shA.t, 2010-07-22

30 answers

Isso teria de ser:
db.users.find({"name": /.*m.*/})

Ou semelhantes:

db.users.find({"name": /m/})

Você está procurando algo que contém " m " em algum lugar (operador SQL 's' % 'é equivalente Ao' .* 'da Regexp), não algo que tem" m " ancorado ao início da cadeia.

 1479
Author: Kyle H, 2017-01-14 04:07:37
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'
Fora: paulo, patric
db.users.find({name: /^pa/}) //like 'pa%' 
Fora: paulo, patric
db.users.find({name: /ro$/}) //like '%ro'

Fora: pedro

 249
Author: Johnathan Douglas, 2015-01-28 18:53:40

Em

  • PyMongo Usando Python
  • Mangusto Usando nó.js
  • Jongo, usando Java
  • mgo , Usando Go

Podes fazer:

db.users.find({'name': {'$regex': 'sometext'}})
 199
Author: Afshin Mehrabani, 2017-04-27 13:17:41

Em PHP, pode usar o seguinte código:

$collection->find(array('name'=> array('$regex' => 'm'));
 76
Author: leon, 2015-06-10 10:04:26

Usarias a regex para isso em mongo.

E. g.: db.users.find({"name": /^m/})

 43
Author: Joshua Partogi, 2010-07-22 03:48:56
 26
Author: Eddy, 2016-09-21 07:44:03
Já há muitas respostas. Estou dando diferentes tipos de requisitos e soluções para pesquisa de cordas com regex.

Você pode fazer com regex que contém a palavra i. e. Como. Também pode usar $options => i para uma pesquisa insensível à capitalização

Contém string

db.collection.find({name:{'$regex' : 'string', '$options' : 'i'}})

Não contém string apenas com regex

db.collection.find({name:{'$regex' : '^((?!string).)*$', '$options' : 'i'}})

Caso EXACTO insensível string

db.collection.find({name:{'$regex' : '^string$', '$options' : 'i'}})

Começa com string

db.collection.find({name:{'$regex' : '^string', '$options' : 'i'}})

Terminar com string

db.collection.find({name:{'$regex' : 'string$', '$options' : 'i'}})

Manter isto como um marcador, e uma referência para quaisquer outras alterações que possa precisar.

 23
Author: Somnath Muluk, 2016-08-11 15:39:09

Tens duas escolhas:

db.users.find({"name": /string/})

Ou

db.users.find({"name": {"$regex": "string", "$options": "i"}})

Na segunda você tem mais opções, como "i" em opções para encontrar usando o caso insensível. E sobre o "string", você pode usar como".fio. "(%string%), ou " string.* "(string%) and".* string) (%string) por exemplo. Você pode usar a expressão regular como quiser.

Divirtam-se!
 15
Author: user3645907, 2017-09-25 21:58:19

Já tens as respostas mas para combinar a regex com a insensibilidade dos casos

Pode usar a seguinte consulta

db.users.find ({ "name" : /m/i } ).pretty()

O i no /m/i indica a insensibilidade dos casos e .pretty() fornece uma saída mais bonita

 14
Author: The6thSense, 2015-11-23 11:21:39

Para Mangusto no nó.js

db.users.find({'name': {'$regex': '.*sometext.*'}})
 11
Author: Aqib Mumtaz, 2015-11-10 11:39:29

Pode usar a nova funcionalidade de 2. 6 mongodb:

db.foo.insert({desc: "This is a string with text"});
db.foo.insert({desc:"This is a another string with Text"});
db.foo.ensureIndex({"desc":"text"});
db.foo.find({
    $text:{
        $search:"text"
    }
});
 10
Author: cmarrero01, 2014-08-04 19:19:03
Para PHP mongo.
Tive vários problemas com o php mongo. descobri que a concatenação dos parâmetros regex ajuda em algumas situações o campo PHP mongo find começa com. Eu pensei que eu iria postar aqui para contribuir para o tópico mais popular

E. g

db()->users->insert(['name' => 'john']);
db()->users->insert(['name' => 'joe']);
db()->users->insert(['name' => 'jason']);

// starts with
$like_var = 'jo';
$prefix = '/^';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);
output: (joe, john)

// contains
$like_var = 'j';
$prefix = '/';
$suffix = '/';
$name = $prefix . $like_var . $suffix;
db()->users->find(['name' => array('$regex'=>new MongoRegex($name))]);

output: (joe, john, jason)
 9
Author: Dap, 2017-05-23 12:18:14

In nodejs project and use mongoose use Like query

var User = mongoose.model('User');

var searchQuery={};
searchQuery.email = req.query.email;
searchQuery.name = {$regex: req.query.name, $options: 'i'};
User.find(searchQuery, function(error, user) {
                if(error || user === null) {
                    return res.status(500).send(error);
                }
                return res.status(200).send(user);
            });
 8
Author: Shaishab Roy, 2016-05-10 18:57:51

Você pode usar a indicação onde compilar qualquer programa JS:

db.myCollection.find( { $where: "this.name.toLowerCase().indexOf('m') >= 0" } );

Referência: http://docs.mongodb.org/manual/reference/operator/where/

 6
Author: Crasher, 2013-09-05 14:53:27

Em SQL, a consulta' como ' é assim:

select * from users where name like '%m%'
Na consola MongoDB, parece isto:
db.users.find({"name": /m/})     // Not JSON formatted

db.users.find({"name": /m/}).pretty()  // JSON formatted

In addion pretty() method will in all the places where produce formatted JSON structure which is more readable.

 6
Author: MAA, 2014-03-19 11:15:12

Usar expressões regulares que correspondam às que se seguem. O " i " Mostra falta de sensibilidade ao caso.

var collections = mongoDatabase.GetCollection("Abcd");

var queryA = Query.And(
         Query.Matches("strName", new BsonRegularExpression("ABCD", "i")), 
         Query.Matches("strVal", new BsonRegularExpression("4121", "i")));

var queryB = Query.Or(
       Query.Matches("strName", new BsonRegularExpression("ABCD","i")),
       Query.Matches("strVal", new BsonRegularExpression("33156", "i")));

var getA = collections.Find(queryA);
var getB = collections.Find(queryB);
 6
Author: Shalabh Raizada, 2016-05-16 11:20:25

In Go and the mgo driver:

Collection.Find(bson.M{"name": bson.RegEx{"m", ""}}).All(&result)

Em que o resultado é a instância estrutural do tipo pretendido

 5
Author: , 2014-03-17 21:50:16

Como a consulta seria como mostrado abaixo

db.movies.find({title: /.*Twelve Monkeys.*/}).sort({regularizedCorRelation : 1}).limit(10);

Para scalaReactiveMongo api,

val query = BSONDocument("title" -> BSONRegex(".*"+name+".*", "")) //like
val sortQ = BSONDocument("regularizedCorRelation" -> BSONInteger(1))
val cursor = collection.find(query).sort(sortQ).options(QueryOpts().batchSize(10)).cursor[BSONDocument]
 4
Author: prayagupd, 2015-05-18 09:55:15

Com a bússola MongoDB, é necessário usar a sintaxe estrita do modo, como tal:

{ "text": { "$regex": "^Foo.*", "$options": "i" } }

(na bússola MongoDB, é importante que uses " em vez de ')

 4
Author: damd, 2017-04-19 08:01:35

Se estiver a utilizar o sistema de dados de Primavera Mongodb pode fazer isto desta forma:

String tagName = "m";
Query query = new Query();
query.limit(10);        
query.addCriteria(Criteria.where("tagName").regex(tagName));
 3
Author: Vaibhav, 2015-04-28 10:34:23
Como Mongo shell suporta regex, isso é completamente possível.
db.users.findOne({"name" : /.*sometext.*/});

Se queremos que a consulta seja insensível à capitalização, podemos usar a opção "i", como mostrado abaixo:

db.users.findOne({"name" : /.*sometext.*/i});
 3
Author: sravanthi, 2016-01-19 08:09:23

Se quiser a pesquisa 'Like' em mongo, então deverá usar a $regex usando esta pesquisa será

db.product.find({name:{$regex:/m/i}})

Para mais pode ler a documentação também. https://docs.mongodb.com/manual/reference/operator/query/regex/

 3
Author: jarry jafery, 2016-08-23 15:03:51

Parece que existem razões para usar tanto o padrão javascript /regex_pattern/ como o padrão mongo {'$regex': 'regex_pattern'}. Ver: Restrições De Sintaxe RegEx MongoBD

Este não é um tutorial RegEx completo, mas eu fui inspirado para executar estes testes depois de ver um post altamente votado Ambíguo acima .

> ['abbbb','bbabb','bbbba'].forEach(function(v){db.test_collection.insert({val: v})})

> db.test_collection.find({val: /a/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.*a.*/})
{ "val" : "abbbb" }
{ "val" : "bbabb" }
{ "val" : "bbbba" }

> db.test_collection.find({val: /.+a.+/})
{ "val" : "bbabb" }

> db.test_collection.find({val: /^a/})
{ "val" : "abbbb" }

> db.test_collection.find({val: /a$/})
{ "val" : "bbbba" }

> db.test_collection.find({val: {'$regex': 'a$'}})
{ "val" : "bbbba" }
 3
Author: Bruno Bronosky, 2017-05-23 12:02:53
Encontrei uma ferramenta gratuita para traduzir as perguntas do MYSQL para o MongoDB. http://www.querymongo.com/ Verifiquei com várias consultas. como vejo, quase todos estão correctos. De acordo com isso, a resposta é
db.users.find({
    "name": "%m%"
});
 2
Author: Lakmal Vithanage, 2016-12-06 05:07:03

O Regex é caro.

Outra maneira é criar um índice de texto e, em seguida, pesquisá-lo usando $search.

Crie um índice de texto dos campos que deseja procurar:

db.collection.createIndex({name: 'text', otherField: 'text'});

Procurar por um texto no índice de texto:

db.collection.find({
  '$text'=>{'$search': "The string"}
})
 2
Author: user3284463, 2018-05-16 05:59:08
MongoRegex foi depreciado.
Usar MongoDB\BSON\Regex
$regex = new MongoDB\BSON\Regex ( '^m');
$cursor = $collection->find(array('users' => $regex));
//iterate through the cursor
 1
Author: Albert s, 2017-01-27 20:06:51

Se está a usar o PHP, pode usar o invólucroMongodb_ DataObject como em baixo:

$model = new MongoDB_DataObject();

$model->query("select * from users where name like '%m%'");

while($model->fetch()) {
    var_dump($model);
}

Ou:

$model = new MongoDB_DataObject('users);

$model->whereAdd("name like '%m%'");

$model->find();

while($model->fetch()) {
    var_dump($model);
}
 1
Author: CEDA, 2017-02-16 08:34:08

Nome Completo Como 'last' com status= = 'Pendente' entre duas datas:

db.orders.find({
      createdAt:{$gt:ISODate("2017-04-25T10:08:16.111Z"),
      $lt:ISODate("2017-05-05T10:08:16.111Z")},
      status:"Pending",
      fullName:/last/}).pretty();

Status= = 'Pendente' e orderId como 'PHA876174':

db.orders.find({
     status:"Pending",
     orderId:/PHA876174/
     }).pretty();
 1
Author: Shubham Verma, 2017-05-06 08:38:57
db.customer.find({"customerid": {"$regex": "CU_00000*", "$options": "i"}}).pretty()

Quando estamos à procura de padrões de cordas, é sempre melhor usar o padrão acima como quando não temos a certeza sobre o caso. Espero que isso ajude!!!

 1
Author: priya raj, 2017-06-02 06:06:13

Usar a pesquisa de subconjuntos de agregação (com índice!!!):

db.collection.aggregate([{
        $project : {
            fieldExists : {
                $indexOfBytes : ['$field', 'string']
            }
        }
    }, {
        $match : {
            fieldExists : {
                $gt : -1
            }
        }
    }, {
        $limit : 5
    }
]);
 1
Author: kz_sergey, 2018-01-03 19:16:55