MongoDB $regex 运算符不使用 mongoc 的 NodeJS 工作



我已经阅读了MongoDB文档,有一个"$regex"运算符。我目前正在为使用bsonsearch的 C++ 编写的驱动程序进行 NodeJS 绑定。我在 NodeJS 中使用此代码:

db.find(bson.serialize({foo: {$regex: new RegExp('.', 'i')}}), function (err, docs) {
//things
});

它经过C++,然后由mongoc-matcher处理。但是mongoc匹配器返回我一个错误:

无效的运算符"$regex">

所以,我搜索了替代方案,我看到了这个作品:

db.find(bson.serialize({foo: {$eq: new RegExp('.', 'i')}}), function (err, docs) {
//things
});

但是我需要处理向后兼容问题的$regex运算符。任何人都有正确的语法?

哦,嗨,我是bsonsearch的作者!

编辑 - 打开一个房间讨论 https://chat.stackoverflow.com/rooms/181623/bsonsearch

edit2:看起来您正在尝试使用扩展的 JSON,但$regex但编码为 BSON 位。 我们需要选择一个或另一个,并在 C 端使用适当的 bson_new_from_* 来反序列化它。

我的代码与mongo-c-driver没有任何关系,除了使用他们的一些代码。 这是一个单独的项目,用于客户端文档匹配。

假设您知道这一点并且没有尝试将 bsoncompare 连接到 mongodb,如果您打算以这种方式使用它,则需要直接在字符串中使用 mongodb 的二进制正则表达式格式。

bsonsearch regex shcema 直接来自 MongoDB Regex Schema(从 $options 拆分$regex( https://docs.mongodb.com/manual/reference/operator/query/regex/

此测试文件包含示例 https://github.com/bauman/bsonsearch/blob/master/lib/tests/bsoncompare_regex.c

对于您的具体情况,请使用以下命令:

spec = {"foo": {"$regex": ".", "$options": "i"}}
^                ^
---------------------------^                ^
--------------------------------------------^ (case insensitive)

将要用作正则表达式的 UTF-8 字符串直接放在 $regex 键中(大写为点(,并添加一个 $options 键,用于不区分大小写(i 表示不区分大小写(

您可能知道这一点,但是 . 只是只匹配字符串中任意位置的一个字符。

https://www.debuggex.com/cheatsheet/regex/pcre

最新更新