检查蒙哥子字符串

时间:2019-04-10 08:35:53

标签: node.js mongodb

我有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中的聚合。 谢谢您的回答!

1 个答案:

答案 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}