3

以下内容让我很困惑。我花了很多时间试图理解为什么 collection.find() 不适用于作为对象传递的正则表达式。正则表达式匹配来自包装在 POST 请求正文中的 HTTP。然后我尝试收集查询(以字符串格式)并执行查询。问题似乎是,除非正则表达式是在没有引号的 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() 吗?我已经研究过了,找到了很多潜在的解决方案,可惜它对我不起作用。

提前致谢!

4

1 回答 1

4

让我专注于你帖子的一行。这可能是问题所在:

正则表达式匹配来自包装在 POST 请求正文中的 HTTP。

这似乎有问题,因为:

在客户端/服务器之间进行序列化的唯一结构是:

  • boolean
  • number
  • string
  • null*
  • objects 和arrays 包含这些基本类型
  • objects 和arrays 包含这些基本类型的objectarrays[of more obj/array]

Regexp, Date, Function, 和许多其他的需要重构,这意味着传递一个字符串或一对strings 用于在接收端运行的matchoption组件进行重构。RegexpRegexp()

Regexp变得有点混乱,因为Regexp.toString()andRegexp()似乎不是彼此的倒数:/someMatch/.toString() is "/someMatch/"但是RegExp("/someMatch/") is //someMatch//重建正则表达式所需的只是RegExp("someMatch"),即/someMatch/. 我希望这有帮助。

JSON.stringify(/someMatch/) is {}(至少在 Chrome 上)。

因此,我建议不要尝试构建通用传输,而是将特定字段重新实例化为正则表达式。

* 无关注意:(null 很好,但 undefined 是特殊的。JSON 不会将undefined对象中的 s 字符串化,并在数组中将 undefined 转换为 null。我认识到这不是您的问题的一部分,只是试图完整地描述可以是什么序列化。)

于 2013-08-11T01:39:03.037 回答