Mongodb 检查字段是否包含字符串

Mongodb 检查字段是否包含字符串,mongodb,Mongodb,我正在寻找一个运算符,它允许我检查字段的值是否包含某个字符串 比如: db.users.findOne({$contains:{"username":"son"}}) 可能吗 由于Mongo shell支持正则表达式,这是完全可能的 db.users.findOne({"username" : /.*son.*/}); 如果希望查询不区分大小写,可以使用“i”选项,如下所示: db.users.findOne({"username" : /.*son.*/i}); 请参阅: MySQL

我正在寻找一个运算符,它允许我检查字段的值是否包含某个字符串

比如:

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

可能吗

由于Mongo shell支持正则表达式,这是完全可能的

db.users.findOne({"username" : /.*son.*/});
如果希望查询不区分大小写,可以使用“i”选项,如下所示:

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

MySQL

蒙哥达

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

您可以使用以下代码来完成

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

如果您要通过Python连接MongoDB,下面是您必须做的事情

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

您也可以使用变量名而不是“Son”,因此可以使用字符串连接。

从2.4版开始,您可以在字段上创建一个用于搜索和使用运算符进行查询的

首先,创建索引:

db.users.createIndex({“用户名”:“文本”})

然后,要搜索:

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

基准(约15万份文件):

  • 正则表达式(其他答案)=>5.6-6.9秒
  • 文本搜索=>.164-.201秒
注:

  • 集合只能有一个文本索引。如果要搜索任何字符串字段,可以使用通配符文本索引,如:
    db.collection.createIndex({“$**”:“text”})
  • 文本索引可以很大。它为插入的每个文档的每个索引字段中的每个唯一词干为后的单词包含一个索引项
  • 文本索引的构建时间将比普通索引长
  • 文本索引不存储短语或文档中单词接近程度的信息。因此,当整个集合适合RAM时,短语查询将更有效地运行

由于这是搜索引擎中最早的热门搜索之一,而且上述各项似乎都不适用于MongoDB 3.x,因此这里有一个正则表达式搜索确实有效:

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

无需创建和附加索引或类似的内容。

完成此任务的最简单方法

如果希望查询区分大小写

db.getCollection("users").find({'username':/Son/})
db.getCollection("users").find({'username':/Son/i})
db.users.findOne({"username" : new RegExp(search_value, 'i') });
如果希望查询不区分大小写

db.getCollection("users").find({'username':/Son/})
db.getCollection("users").find({'username':/Son/i})
db.users.findOne({"username" : new RegExp(search_value, 'i') });

如何在RegExp匹配中忽略HTML标记:

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));
虎(Panthera tigris)体型最大,最容易辨认,因为它的红色皮毛上有黑色垂直条纹,底部较浅。本种以、、和分类在属中。它是一种生物,主要捕食和等动物。

'; var searchString=‘最大的猫科动物种类’; var rx=“”; searchString.split(“”).forEach(e=>{ rx+='('+e+')((?:\\s*(?:)?\\s*))”; }); rx=新的RegExp(rx,'igm'); console.log(text.match(rx));
这很容易变成MongoDB聚合过滤器。

理想的答案是它的使用索引 i用于不区分大小写的选项

db.getCollection("users").find({'username':/Son/})
db.getCollection("users").find({'username':/Son/i})
db.users.findOne({"username" : new RegExp(search_value, 'i') });

这应该可以解决问题

db.users.find({ username: { $in: [ /son/i ] } });
i
只是为了防止限制匹配单个字母的大小写

您可以查看MongoDB文档中的
$regex
文档。
这里有一个链接:

如果您的正则表达式包含一个变量,请确保它

这个可以这样使用

new RegExp(escapeRegExp(searchString), 'i')
{ '$regex': escapeRegExp(searchString) }
或者在像这样的mongoDb查询中

new RegExp(escapeRegExp(searchString), 'i')
{ '$regex': escapeRegExp(searchString) }
为聚合框架发布了相同的评论
字段搜索

“$options”:“i”
用于不区分大小写的搜索)

db.users.aggregate([
{
$match:{
'email':{'$regex':'@gmail.com','$options':'i'}
}
}
]);

完整文档搜索

(仅适用于使用

db.articles.aggregate([
{
$match:{$text:{$search:“勇敢的新世界”}
}
])

如果需要搜索多个属性,可以使用$or。例如

Symbol.find(
  {
    $or: [
      { 'symbol': { '$regex': input, '$options': 'i' } },
      { 'name': { '$regex': input, '$options': 'i' } }
    ]
  }
).then((data) => {
  console.log(data)
}).catch((err) => {
  console.log(err)
})

这里,如果你的搜索包含在符号属性或名称属性中。你的MangGDB答案是好的;考虑编辑你的问题来删除无关的MySQL建议。删除所有查询或更改它。大多数已知的SQL,有助于理解。MongoDB@ZhengKai:在这个网站上,你应该典型地直接回答问题,只使用标记和请求的特定技术。@maerics我个人认为Zheng包含的MySQL非常有用,因为它提供了一个参考点。我还发现SQL参考相关,我认为应该保留。请包含一个代码片段,演示sea正则表达式的用法rching.Answers应该包含更多的信息,而不仅仅是一个链接…所选答案对我来说不起作用,但这一个确实起作用(我正在通过docker exec命令执行mongo查询),我认为这一个应该是所选答案,因为它看起来更通用。就像所选答案中的注释一样,我相信

db.users.findOne({“username”:/*son.*/});
也可能有些过分,regex可以是比使用$regexEdit更简洁的方法,只使用
{username:/son/}
请注意,这不会有效地使用索引,并导致扫描所有值以查找匹配项。请参阅@Stennie上的注释,那么您建议如何有效地使用索引并查找子字符串。@Vish:如果您的常用用例是自由文本搜索字段,并且您有大量文档,我会标记text用于更高效的查询。您可以使用它进行简单的全文搜索,或者作为单独的集合构建。对于不频繁的搜索或小文档集合,扫描完整索引可能是可以接受的(尽管不是最佳的)性能。这不是有点过分了吗?您想要的是
db.users.findOne({“username”)“:{$regex:“son”});
可能想在Mongo 2.6no中查看全文搜索,事实上文本操作符不允许执行“contains”,因此它只返回精确的单词匹配,从3.0开始,当前唯一的选项是使用regex,即db.users。查找({username:/son/i})这个