我有mongo聚合过滤器:
query['$or'] =
{
firstName: {
$search: filter.keyword,
},
},
{
lastName: {
$regex: filter.keyword, $options: 'xi',
},
},
然后我将查询附加到聚合。 有用户:firstName:'john'。 lastName:“雪”。 如果filter.keyword ='jo','john','john'都有效,则返回1结果,但如果filter.keyword ='john s',则返回0。 我知道我不需要检查正则表达式,而需要检查结果字符串中字段值的出现,那么所有后续字符都将被忽略,结果将返回给我。我无法拆分,请检查数组中的条目,这会导致复杂名称错误。 这可能是一个非常愚蠢的问题,但是我无法验证字符串“ John S”中是否出现了约翰这个名字。 以后的查询将附加到$ match中的聚合。 谢谢您的回答!
答案 0 :(得分:0)
您可以继续使用正则表达式和断词:
filter.keyword.split(" ").join("|")
这将搜索与“ john”或“ s”匹配的名字:
$regex: "john|s"
否则,您可以直接使用$ text: https://docs.mongodb.com/manual/reference/operator/query/text/ 但是,根据我建议的解决方案,它将对每个单词应用$或
最后,您可以使用$ indexOfBytes(子字符串搜索):
db.a.insert({name: "john", firstname: "snow"})
db.a.aggregate([{$project: {byteLocation:{$indexOfBytes:["john s", "$name"]}}}])
// { "_id" : ObjectId("5cadb07ddf1f1fe1647e252f"), byteLocation: 0}
db.a.aggregate([{$project: {byteLocation:{$indexOfBytes:["f john s", "$name"]}}}])
// { "_id" : ObjectId("5cadb07ddf1f1fe1647e252f"), byteLocation: 2}