【问题标题】:Query value gets quoted automatically before sending it to MongoDB?查询值在发送到 MongoDB 之前被自动引用?
【发布时间】:2013-08-11 01:23:49
【问题描述】:

以下内容让我很困惑。我花了很多时间试图理解为什么 collection.find() 不适用于作为对象传递的正则表达式。正则表达式匹配来自包装在 POST 请求正文中的 HTTP。然后我尝试收集查询(以字符串格式)并执行查询。问题似乎是,除非正则表达式写在 Node without 引号内,否则它将不起作用。也就是说,它必须是不带引号的文字。

例如,以下工作正常:

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() 吗?我已经研究过了,找到了很多潜在的解决方案,可惜它不适合我。

提前致谢!

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

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

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

    这似乎有问题,因为:

    在客户端/服务器之间的序列化中幸存下来的唯一结构是:

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

    RegexpDateFunction 和许多其他人需要重建,这意味着 为Regexpmatchoption 组件传递一个字符串或一对strings,并在接收端运行Regexp() 进行重构。

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

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

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

    * 无关注意:(null 很好,但 undefined 是特殊的。JSON 不会在对象中对 undefineds 进行字符串化,并在数组中将 undefined 转换为 null。我知道这不是您的问题的一部分,只是想成为完整地描述了可以序列化的内容。)

    【讨论】:

    • 非常有趣的保罗。所以,如果我需要从客户端向服务器发送一个正则表达式字符串(即 /goog/),你将如何通过网络发送信息?我尝试发送一个 JSON 字符串(即 {'company': '/goog/', 'match': 'regex'} 并在服务器端构建它,但我无法使其工作,因为该值始终被视为一个字符串,这似乎是问题所在。有什么想法吗?感谢您的帮助!
    • 只需发送'{"match": "goog"}'。接收器运行RegExp(obj.match) 并得到/goog/,即使"goog" 中没有倾斜。
    • 您可能需要 new RegExp("goog") 而不是 RegExp("goog") 但两者似乎都可以在 chrome 控制台中使用。
    • 保罗,它就像魅力一样!我什至可以像这样扩展查询字符串:'{"match": "goog", "flags": "i"}'。惊人的。谢谢!
    猜你喜欢
    • 2012-04-26
    • 2017-11-09
    • 1970-01-01
    • 2018-08-04
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多