我想用SQL查询一些东西,比如查询:
SELECT * FROM users WHERE name LIKE '%m%'
如何在MongoDB中实现这一点?我在文档中找不到这样的操作员。
我想用SQL查询一些东西,比如查询:
SELECT * FROM users WHERE name LIKE '%m%'
如何在MongoDB中实现这一点?我在文档中找不到这样的操作员。
当前回答
Use:
const indexSearch = await UserModel.find(
{ $text: { $search: filter } },
);
if (indexSearch.length) {
return indexSearch;
}
return UserModel.find(
{
$or: [
{ firstName: { $regex: `^${filter}`, $options: 'i' } },
{ lastName: { $regex: `^${filter}`, $options: 'i' } },
{ middleName: { $regex: `^${filter}`, $options: 'i' } },
{ email: { $regex: `^${filter}`, $options: 'i' } },
],
},
);
我使用了正则表达式和“索引”的组合。
其他回答
您可以在MongoDB中使用正则表达式。
例如
db.users.find({"name": /^m/})
前面的答案完美地回答了有关MongoDB核心查询的问题。但当使用基于模式的搜索查询时,例如:
{“keywords”:{“$regex”:“^toron.*”}}
or
{“关键字”:{“$regex”:“^toron”}}
在带有@query注释的Spring Boot JPA存储库查询中,使用如下查询:
@Query(value = "{ keyword : { $regex : ?0 } }")
List<SomeResponse> findByKeywordContainingRegex(String keyword);
呼叫应为:
List<SomeResponse> someResponseList = someRepository.findByKeywordsContainingRegex("^toron");
List<SomeResponse> someResponseList = someRepository.findByKeywordsContainingRegex("^toron.*");
但千万不要使用:
List<SomeResponse> someResponseList = someRepository.findByKeywordsContainingRegex("/^toron/");
List<SomeResponse> someResponseList =someRepository.findByKeywordsContainingRegex("/^toron.*/");
需要注意的一点是:每次?@Query语句中的0字段替换为双引号字符串。因此,在这些情况下不应使用正斜杠(/)!在搜索模式中始终使用双引号!!例如,在/^toron/或/^toron上使用“^toron”或“^toron.*”*/
使用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
]
})
游戏场
这必须是:
db.users.find({"name": /.*m.*/})
或类似:
db.users.find({"name": /m/})
您正在查找某个地方包含“m”的内容(SQL的“%”运算符相当于正则表达式“.*”),而不是在字符串开头锚定了“m”。
注意:MongoDB使用的正则表达式比SQL中的“LIKE”更强大。使用正则表达式,您可以创建任何您想象的模式。
有关正则表达式的详细信息,请参阅正则表达式(MDN)。
>> db.car.distinct('name')
[ "honda", "tat", "tata", "tata3" ]
>> db.car.find({"name":/. *ta.* /})