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

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

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


当前回答

为了以防万一,有人正在寻找一种SQL LIKE类型的查询,以查找包含字符串数组而不是字符串的键,这里是:

db.users.find({"name": {$in: [/.*m.*/]}})

其他回答

如果您有字符串变量,则必须将其转换为正则表达式,因此MongoDB将对其使用类似的语句。

const name = req.query.title; //John
db.users.find({ "name": new Regex(name) });

结果与:

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

如果您使用的是Spring Data MongoDB,可以通过以下方式实现:

String tagName = "m";
Query query = new Query();
query.limit(10);
query.addCriteria(Criteria.where("tagName").regex(tagName));

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

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

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

使用JavaScript RegExp

按空格拆分名称字符串,并生成单词数组映射到迭代循环,并将字符串转换为名称中每个单词的正则表达式

let name=“My name”.split(“”).map(n=>新RegExp(n));console.log(名称);

结果:

[/My/, /Name/]

有两种情况可以匹配字符串,

$in:(类似于$or条件)

尝试在表达式中使用$。要在$in查询表达式中包含正则表达式,只能使用JavaScript正则表达式对象(即/patter/)。例如:

db.users.find({ name: { $in: name } }); // name = [/My/, /Name/]

$all:(类似于$和条件)文档应包含所有单词

db.users.find({ name: { $all: name } }); // name = [/My/, /Name/]

使用嵌套的$and和$or条件和$regex

有两种情况可以匹配字符串,

$或:(类似于$in条件)

db.users.find({
  $or: [
    { name: { $regex: "My" } },
    { name: { $regex: "Name" } }
    // if you have multiple fields for search then repeat same block
  ]
})

游戏场

$和:(类似于$all条件)文档应包含所有单词

db.users.find({
  $and: [
    {
      $and: [
        { name: { $regex: "My" } },
        { name: { $regex: "Name" } }
      ]
    }
    // if you have multiple fields for search then repeat same block
  ]
})

游戏场

对于Node.js中的Mongoose:

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