查询值在被发送到MongoDB之前被自动引用?
以下是我很多困惑。 我花了相当多的时间试图理解为什么collection.find()不能用作为对象传递的正则expression式。 正则expression式匹配是通过包装在POST请求正文中的HTTP来实现的。 然后我尝试收集查询(以string格式)并执行查询。 这个问题似乎是,除非正则expression式写在节点里面没有引号,它将无法正常工作。 也就是说,它必须是一个没有引号的文字。
例如,以下工作正常:
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 shelltesting过了,我可以确认下列内容:
// 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 };
所以从技术上讲,一个不包含引号的“literal”正则expression式可以正常工作。 但是,如果它是一个string,它将无法正常工作。 即使试图用双引号和单引号replace(即实质上删除它们)。
任何想法如何才能得到的正则expression式匹配逐字传递给find()? 我研究过它,发现了很多潜在的解决scheme,唉,它不适合我。
提前致谢!
让我专注于您的文章的一行。 这是问题可能出在哪里:
正则expression式匹配是通过包装在POST请求正文中的HTTP来实现的。
这看起来有问题,因为:
客户端/服务器之间唯一的序列化结构是:
-
boolean
-
number
-
string
-
null
* - 包含这些基本types的
object
和array
- 包含这些基本types的
object
和arrays
[更多obj /数组]的object
和arrays
Regexp
, Date
, Function
和其他主机都需要重构,这意味着传递一个string或一对string
作为正则string
的match
和option
组件,并在接收端运行Regexp()
来重构。
Regexp
有点乱,因为Regexp.toString()
和Regexp()
看起来并不相互/someMatch/.toString() is "/someMatch/"
: /someMatch/.toString() is "/someMatch/"
但RegExp("/someMatch/") is //someMatch//
和重build正则expression式所需要的只是RegExp("someMatch")
,它是/someMatch/
。 我希望这有帮助。
JSON.stringify(/someMatch/) is {}
(至less在Chrome上)。
因此,我build议不要试图build立一个通用的交通工具,而是将一个特定的领域作为一个正则expression式来实例化。
*不相关的注意:(null是好的,但没有定义是特殊的,JSON不会将对象中的undefined
的string串联起来,并且在数组中将undefined变为null。我认识到这不是你问题的一部分,只是试图完整地描述什么被序列化。)