gpt4 book ai didi

node.js - 查询值在发送到 MongoDB 之前会自动引用吗?

转载 作者:可可西里 更新时间:2023-11-01 09:31:50 26 4
gpt4 key购买 nike

以下内容让我很困惑。我花了很多时间试图理解为什么 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() 吗?我对其进行了研究,找到了很多可能的解决方案,可惜它对我不起作用。

提前致谢!

最佳答案

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

The regex match is coming over HTTP wrapped in the body of a POST request.

这似乎有问题,因为:

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

  • bool 值
  • 编号
  • 字符串
  • null *
  • 对象和包含这些基本类型的数组
  • objects and arrays contains object and arrays [of more obj/array] 这些基本的类型

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

Regexp 变得有点困惑,因为 Regexp.toString()Regexp() 似乎不是彼此的反函数:/someMatch/.toString() 是 "/someMatch/"RegExp("/someMatch/") 是//someMatch// 以及重建正则表达式所需要的只是 RegExp("someMatch"),即 /someMatch/。我希望这会有所帮助。

JSON.stringify(/someMatch/) 是 {}(至少在 Chrome 上是这样)。

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

* 不相关的注释:(null 很好,但 undefined 是特殊的。JSON 不会将对象中的 undefined 字符串化,也不会在数组中将 undefined 变成 null。我知道这不是你问题的一部分,只是试图完整地描述可以序列化的内容。)

关于node.js - 查询值在发送到 MongoDB 之前会自动引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18167882/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com