以下让我很困惑。我花了很多时间试图理解为什么collection.find()不能与作为对象传递的正则表达式一起工作。正则表达式匹配是通过HTTP包裹在POST请求的主体中。然后我尝试收集查询(以字符串格式)并执行查询。问题似乎是除非正则表达式在Node 中编写而没有引号,否则它将无效。也就是说,它必须是没有引号的文字。
例如,以下工作正常:
var query1 = {
company: {
'$regex': /goog/
}
};
collection.find(query1, {}).toArray(function (err, docs) {
// Got results back. Awesome.
});
但是,如果数据包含在对象中,则不会返回任何内容。我怀疑这是因为该值在幕后被引用(即“/ goog /”):
// Assume
var query2 = {
company: {
'$regex': query.company
}
};
collection.find(query2, {}).toArray(function (err, docs) {
// Got nothing back.
});
我已经使用mongo shell测试了它,我可以确认以下内容:
// Returns 5 results
db.getCollection("contacts").find( { "company": /goog/ } )
// Doesn't match anything
db.getCollection("contacts").find( { "company": "/goog/" } )
此外,我刚刚发现了以下内容:如果我用引号
写入值// Works fine
var companyRegex = {'$regex': /goog/};
var query3 = {
company: companyRegex
};
从技术上讲,没有引号包装在对象中的“文字”正则表达式可以正常工作。但如果它是一个字符串,它将无法正常工作。甚至在试图用任何东西替换双引号和单引号之后(即基本上删除它们)。
任何想法如何将正则表达式匹配逐字传递给find()?我研究了它,找到了很多潜在的解决方案,唉它对我不起作用。
提前致谢!
答案 0 :(得分:3)
让我专注于你的帖子的一行。这就是问题所在:
正则表达式匹配是通过HTTP包裹在POST请求的主体中。
这似乎有问题,因为:
在客户端/服务器之间存在序列化的唯一结构是:
boolean
number
string
null
* object
和array
包含这些基本类型object
和array
s包含object
和arrays
[更多obj / array]这些基本类型 Regexp
,Date
,Function
以及其他许多人需要重建,这意味着
为string
的{{1}}和match
组件传递一串或option
个字符串,并在接收端运行Regexp
进行重建。
Regexp()
变得有点混乱,因为Regexp
和Regexp.toString()
似乎并不是彼此的反转:Regexp()
但是/someMatch/.toString() is "/someMatch/"
而是需要的是重建正则表达式只是RegExp("/someMatch/") is //someMatch//
,即RegExp("someMatch")
。我希望这会有所帮助。
/someMatch/
(至少在Chrome上)。
因此,我建议不要尝试构建通用传输,而是将特定字段重新实例化为正则表达式。
*不相关的注释:(null很好,但未定义是特殊的.JSON不会在对象中对JSON.stringify(/someMatch/) is {}
进行字符串化,并且在数组中将undefined变为null。我认识到这不是你问题的一部分,只是尝试完成描述可序列化的内容。)