我想要实现的是找到一种方法来验证MongoDB文档中是否已存在URL,而不保存URL两次,一个使用HTTP(s)(www)协议,以及其他干净的HTTP( s)(www)进行比赛。 例如,如果MongoDB文档包含记录:
'url': "http://mysite.co?search=pattern&co=43"
所以,我想进行搜索:
MyCollection.find({'url': "mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "http://mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "https://mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "http://www.mysite.co?search=pattern&co=43"})...
MyCollection.find({'url': "https://www.mysite.co?search=pattern&co=43"})...
搜索应与文档中实际保存的URL匹配。
我正在尝试使用以下正则表达式:
MyCollection.find({'url': new RegExp('^https?:\/\/(www.)?(' + 'mysite.co?search=pattern&co=43' + ')+$', 'gim')})...
但是,我不是很聪明地创建正则表达式,我仍然在努力。似乎URL中的问号打破了正则表达式,我不确定是否只使用'?'替换至 '\?'是正确的方法。
搜索必须与数据库中的URL“完全匹配”,但HTTP(s)(www)协议除外。我的意思是,如果文档中的URL包含其他参数:
'url': "http://mysite.co?search=pattern&co=43&other=more_params"
这次搜索不应该匹配。
我正在使用Mongoose和nodejs。
提前致谢。
更新
根据你的答案,我已经改进了一点正则表达式和scaping URL:
首先,修剪和“清理”HTTP(s)或(www)的URL的功能:
String.prototype.url_clean = function() {
return this.trim().replace(/^(http(s|):\/\/)?(www\.|)/g, '');
};
一个逃避URL的函数:
RegExp.escape = function(s) {
return s.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
};
所以我可以执行搜索:
MyCollection.find({'url': new RegExp('^(http(s|):\/\/)?(www\.|)(' + RegExp.escape(url.url_clean()) + ')(|\s)+$', "gim")})
答案 0 :(得分:2)
问题是您必须从正则表达式中删除网址的特定元素(例如&#39;?&#39;)/^http(s|):\/\/(www\.|)mysite\.co\?search=pattern&co=43/
相反,我会编写一个脚本来拉取所有记录,将它们分成单独的字段,保存新文档。查询这些新字段而不是使用正则表达式
答案 1 :(得分:2)
看起来很好,你只是忘了逃避一些角色:
CREATE TABLE Vet
(VET_NUM CHAR(2) PRIMARY KEY,
LAST_NAME CHAR(20),
FIRST_NAME CHAR(20),
STREET CHAR(30),
CITY CHAR(20),
STATE CHAR(20),
POSTAL_CODE CHAR(20),
SALARY DECIMAL(8,2),
DEGREE CHAR(20),
POSITION CHAR(20));
INSERT INTO Vet(VET_NUM,LAST_NAME,FIRST_NAME,STREET,CITY,STATE,POSTAL_CODE,SALARY,DEGREE,POSITION)
VALUES
('1','Skechley','Cristine','24340 7th Plaza','Pittsburgh','PA','15274',88053.30,'Masters','Vet');
INSERT INTO Vet
VALUES
('2','Fishpoole','Sig','06784 Anthes Point','Philadelphia','PA','19184',45525.56,'Associates','Receptionist');
INSERT INTO Vet
VALUES
('3','Stother','Rycca','04304 Superior Hill','Allentown','PA','18105',90553.37,'Masters','Vet');
INSERT INTO Vet
VALUES
('4','Scandrite','Kerrill','30320 Express Crossing','Harrisburg','PA','17126',102553.59,'Doctorates','Vet');
INSERT INTO Vet
VALUES
('5','Glassman','Rhett','33418 Tomscot Trail','Mc Keesport','PA','15134',56052.24,'Bachelor','Management');
INSERT INTO Vet
VALUES
('6','Gioan','Rab','1 Pennsylvania Street' ,'Hatfield','PA','19440',35880.76,'Student','Janitor');
有关MongoDB中正则表达式的更多信息,请阅读here