2

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

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

它通过 C++ 并由 mongoc-matcher 处理。但是 mongoc-matcher 给我一个错误:

无效的运算符“$regex”

所以,我搜索了替代方案,我发现这是可行的:

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

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

4

1 回答 1

0

哦,嗨,我是bsonsearch的作者!

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

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

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

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

bsonsearch 正则表达式 shcema 直接来自 mongodb 正则表达式模式(从 $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

于 2018-10-09T15:20:38.007 回答