当前位置:  开发笔记 > 编程语言 > 正文

如何用"喜欢"查询MongoDB?

如何解决《如何用"喜欢"查询MongoDB?》经验,为你挑选了22个好方法。

我想查询一下SQL的like查询:

SELECT * FROM users  WHERE name LIKE '%m%'

如何在MongoDB中做同样的事情?
like在文档中找不到运算符.



1> 小智..:

那必须是:

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

或者,类似的:

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

你正在寻找某处包含"m"的东西(SQL的' %'运算符等同于Regexp' .*'),而不是将"m"锚定到字符串开头的东西.


实际上,这取决于.如果查询不使用索引,并且必须进行表扫描,那么它肯定会很昂贵.如果你正在进行'开头'正则表达式查询,那么可以使用索引.最好运行一个explain()来看看发生了什么.
正在寻找昂贵的正则表达式?
我会添加正则表达式```javascript db.users.find({"name":{$ regex:/ m/i}})```
当没有锚定到字符串的开头时,它有点贵.但话说回来,SQL中的`LIKE`查询也是如此.
所以只要它固定在字符串的开头就可以了吗?然后很酷.这是否意味着我们需要添加^
@Freewind:不,它不贵.

2> 小智..:
db.users.insert({name: 'paulo'})
db.users.insert({name: 'patric'})
db.users.insert({name: 'pedro'})

db.users.find({name: /a/})  //like '%a%'

出:paulo,patric

db.users.find({name: /^pa/}) //like 'pa%' 

出:paulo,patric

db.users.find({name: /ro$/}) //like '%ro'

出:佩德罗



3> Afshin Mehra..:

PyMongo使用Python

使用Node.js的Mongoose

Jongo,使用Java

mgo,使用Go

你可以做:

db.users.find({'name': {'$regex': 'sometext'}})


@TahirYasin如果你还在想,不区分大小写的搜索会像这样:`db.users.find({'name':{'$ regex':'sometext','$ options':'i'} })`
它适用于区分大小写的搜索,你能否告诉我如何让它能够执行不区分大小写的搜索?

4> leon..:

在PHP中,您可以使用以下代码:

$collection->find(array('name'=> array('$regex' => 'm'));


python + mongoengine:people = People.objects.raw_query({'name':{'$ regex':'m'}})
我刚刚意识到这一点,但这实际上是错误的答案,即使它的工作原理是次优的,你应该通过MongoRegex使用实际的BSON正则表达式对象,$ regex与某些命令(如$ in)存在兼容性问题

5> Joshua Parto..:

你可以在mongo中使用正则表达式.

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


我认为这只显示名称值以"m"开头的文档

6> Somnath Mulu..:

已经有很多答案了.我正在为正则表达式的字符串搜索提供不同类型的要求和解决方案.

您可以使用包含单词的正则表达式,例如.您也可以使用$options => i不区分大小写的搜索

包含 string

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

不包含string仅使用正则表达式

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

确切的不区分大小写 string

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

从...开始 string

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

结束 string

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

保持此为书签,以及您可能需要的任何其他改变的参考.



7> user3645907..:

你有2个选择:

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

要么

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

在第二个上你有更多选项,比如"i"在选项中查找使用不区分大小写.关于"字符串",您可以使用" .string. "(%string%)或"string.*"(字符串%)和".*string"(%字符串)等.您可以使用正则表达式如你所愿.

请享用!



8> Eddy..:

如果使用node.js,它表示你可以这样写:

db.collection.find( { field: /acme.*corp/i } );
//or
db.collection.find( { field: { $regex: 'acme.*corp', $options: 'i' } } );

另外,你可以这样写:

db.collection.find( { field: new RegExp('acme.*corp', 'i') } );



9> The6thSense..:

你已经得到了答案,但要将正则表达式与不区分大小写相匹配

您可以使用以下查询

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

i/m/i表示不区分大小写和.pretty()提供了一个更漂亮输出



10> Aqib Mumtaz..:

对于Node.js中的Mongoose

db.users.find({'name': {'$regex': '.*sometext.*'}})



11> cmarrero01..:

您可以使用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"
    }
});


注意,AFAIK Mongodb的文本搜索仅在默认情况下对整个单词起作用,因此这将匹配"This is a string with text"之类的值,但不匹配"This is a string with subtext".所以它不像sql的"LIKE"运算符.

12> Dap..:

对于PHP mongo喜欢.
我有几个与php mongo有关的问题.我发现连接正则表达式params有助于在某些情况下PHP mongo find字段开头.我想我会发布在这里为更受欢迎的线程做出贡献

例如

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)



13> Shaishab Roy..:

nodejs项目中并使用mongoose使用Like查询

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);
            });



14> damd..:

使用MongoDB Compass,您需要使用严格模式语法,如下所示:

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

(在MongoDB Compass中,重要的是你使用"而不是')



15> MADHAIYAN M..:

在SQL中,' like '查询如下所示:

select * from users where name like '%m%'

在MongoDB控制台中,它看起来像这样:

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

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

在addion pretty()方法中,将生成格式化JSON结构的所有地方都更具可读性.



16> Rust..:

正则表达式是昂贵的过程.

另一种方法是创建文本索引,然后使用它进行搜索$search.

创建要搜索的字段的文本索引:

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

在文本索引中搜索字符串:

db.collection.find({
  '$text'=>{'$search': "The string"}
})



17> brenoriba..:

您可以使用where语句来构建任何JS脚本:

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

参考:http://docs.mongodb.org/manual/reference/operator/where/


`$ where`是非常低效的.做全集扫描:(

18> 小智..:

在Go和mgo驱动程序中:

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

其中result是搜索类型的struct实例


请避免文字中的无键字段,请执行`bson:RegEx {Pattern:"m",Options:"i"}`

19> 小智..:

使用如下匹配的正则表达式.'i'表示不区分大小写.

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);



20> besthost..:

将模板文字与变量一起使用也可以:

{"firstname": {$regex : `^${req.body.firstname}.*` , $options: 'si' }}



21> prayagupd..:

像Query一样如下所示

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

对于scala ReactiveMongo 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]



22> Bruno Bronos..:

似乎有理由同时使用javascript /regex_pattern/模式和mongo {'$regex': 'regex_pattern'}模式。请参阅:MongoBD RegEx语法限制

这不是完整的RegEx教程,但是在看到上面的一票vote昧的帖子后,我受到启发去运行这些测试。

> ['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" }

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有