【问题标题】:MongoDB regex array (reverse regex?)MongoDB 正则表达式数组(反向正则表达式?)
【发布时间】:2018-07-05 15:11:47
【问题描述】:

我有以下问题:

我正在使用 NodeJSExpressMongoDB 来查询我的数据库。

我在包含字段“域”的“域”集合中有一个文档。

例如:

{ 
  "domain" : "mydomain.com, www.mydomain.com, beta.mydomain.com, *.beta.mydomain.com",
  "APIKeys" : [ "Public" : 111111 ]
}

或其他文件:

{ 
  "domain" : "example.com, *.example.com",
  "APIKeys" : [ "Public" : 222222 ]
}

如果extractHostname(req.get('Referrer')) 匹配字段中的任何域,我想查询数据库并返回结果。

var collection = 'domains';
var query = { $and: [ { 'APIKeys.Public' : req.query.APIKey }, {'domain' : extractHostname(req.get('Referrer')) } ] };
var projection = { '_id' : 1 , 'playerPref' : 1 };

例如:extractHostname(req.get('Referrer')) = beta.mydomain.com 它应该返回 true,因为它匹配 beta.mydomain.com 的正则表达式。

'test.beta.mydomain.com' 应该返回 true,因为它匹配 *.beta.mydomain.com 的正则表达式。

'test.www.mydomain.com' 应该返回 false

'www.mydomain.com.maliciousdomain.com' 应该返回 false

知道如何进行这样的查询来检查推荐人是否符合条件吗?

我面临的问题是字段中的任何字符串都需要匹配查询,而不是相反。请记住字段中的通配符,而不是搜索字符串中的通配符。 (这就像一个储备正则表达式?)

亲切的问候, 雨果

【问题讨论】:

  • 如果您希望它包含beta.mydomain.com,那么只需use that as your regular expression
  • 我更新了我的问题以更好地反映问题。输入是引用者的主机名。应根据数据库检查它是否匹配该字段中的任何域,包括通配符。

标签: regex mongodb


【解决方案1】:

在看到您更新的要求后,我创建了一个可以匹配您的各种域类型的模式。 Here it is

(?(?=.* .*)(([^ \n>]*)(?:.*))|([^\w\W]))

它将始终匹配mydomain.com,带有可选的www.、可选的beta.和可选的通配符。

【讨论】:

  • 感谢您的回答,但每个文档的子域可能不同,这只是一个示例,应该如何匹配。我再次更新了我的问题以更好地反映这一点。
  • 所以如果有人在域字段中存储了例如 sub.domain.com ,那么如果搜索包含 sub.domain.com 则此查询仍然有效并返回 true 吗?
  • 尝试在 Javascript (nodeJS) 中设置时收到模式错误。您能否向我解释一下它是如何工作的以及它在哪里检查?我不知道如何将它与用户字符串输入一起使用并检查域字段中的字符串。对不起
  • var query = { $and: [ {'domain' : extractHostname(req.get('Referrer')) }, { 'APIKeys.Public' : req.query.APIKey } ] };
  • 我应该先让它搜索 APIKeys.Public,然后让它对所有文档中的所有域字段执行正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多