MongoDB正则表达式数组(反向正则表达式?)

时间:2018-07-05 15:11:48

标签: regex mongodb

我有以下问题:

我正在使用 NodeJS Express MongoDB 来查询我的数据库。

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

例如:

{ 
  "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

有什么主意我可以进行这样的查询来检查引荐来源网址是否符合条件?

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

亲切的问候, 雨果

1 个答案:

答案 0 :(得分:1)

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

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

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