【问题标题】:check substring in mongo检查mongo中的子字符串
【发布时间】:2019-04-10 08:35:53
【问题描述】:

我有 mongo 聚合的过滤器:

query['$or'] = 
 {
   firstName: {
     $search: filter.keyword,
   },
 },
 {
   lastName: {
     $regex: filter.keyword, $options: 'xi',
 },
},

稍后我将查询附加到聚合。 有用户:名字:'约翰'。姓氏:'雪'。 如果 filter.keyword = 'jo', 'john', 'john ', 一切正常,返回 1 个结果,但如果 filter.keyword = 'john s',返回 0。 我知道我需要检查的不是正则表达式,而是结果字符串中是否出现字段值,然后所有后续字符都将被忽略,结果将返回给我。我无法拆分,并检查数组中的条目,复杂名称会出错。 这可能是一个非常愚蠢的问题,但我无法验证名称 John 在字符串“John S”中的出现。 稍后的查询将附加到 $match 中的聚合。 谢谢你的回答!!!

【问题讨论】:

标签: node.js mongodb


【解决方案1】:

你可以继续使用正则表达式和分词:

filter.keyword.split(" ").join("|")

这将搜索匹配“john”或“s”的名字:

 $regex: "john|s"

否则你可以直接使用 $text : https://docs.mongodb.com/manual/reference/operator/query/text/ 但它会在每个单词上应用一个 $or,就像我提出的解决方案一样

最后你可以使用 $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}

【讨论】:

    猜你喜欢
    • 2011-02-18
    • 2013-11-12
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    相关资源
    最近更新 更多