查询值在被发送到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的objectarray
  • 包含这些基本types的objectarrays [更多obj /数组]的objectarrays

RegexpDateFunction和其他主机都需要重构,这意味着传递一个string或一对string作为正则stringmatchoption组件,并在接收端运行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。我认识到这不是你问题的一部分,只是试图完整地描述什么被序列化。)