我想用SQL查询一些东西,比如查询:

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

如何在MongoDB中实现这一点?我在文档中找不到这样的操作员。


当前回答

由于MongoDB外壳支持正则表达式,这是完全可能的。

db.users.findOne({"name" : /.*sometext.*/});

如果我们希望查询不区分大小写,可以使用“i”选项,如下所示:

db.users.findOne({"name" : /.*sometext.*/i});

其他回答

对于MongoDB Compass,您需要使用严格的模式语法,例如:

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

(在MongoDB Compass中,使用“而不是”很重要)

这必须是:

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

或类似:

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

您正在查找某个地方包含“m”的内容(SQL的“%”运算符相当于正则表达式“.*”),而不是在字符串开头锚定了“m”。

注意:MongoDB使用的正则表达式比SQL中的“LIKE”更强大。使用正则表达式,您可以创建任何您想象的模式。

有关正则表达式的详细信息,请参阅正则表达式(MDN)。

字符串yourdb={deepakparmar,dipak,parmar}

db.getCollection('yourdb').find({"name":/^dee/})

ans deepakparmar公司

db.getCollection('yourdb').find({"name":/d/})

ans deepakparmar,迪帕克

db.getCollection('yourdb').find({"name":/mar$/})

ans deepakparmar,帕尔马

如果使用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') } );

可以使用正则表达式进行查询:

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

如果字符串来自用户,则可能需要在使用该字符串之前对其进行转义。这将防止来自用户的文字字符被解释为正则表达式标记。

例如,如果不转义,搜索字符串“A”也将匹配“AB”。在使用字符串之前,可以使用一个简单的替换来转义字符串

function textLike(str) {
  var escaped = str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&');
  return new RegExp(escaped, 'i');
}

所以现在,字符串变成了一个不区分大小写的模式,同时匹配文字点。例子:

>  textLike('A.');
<  /A\./i

现在,我们可以随时生成正则表达式了:

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