MongoDB $ regex оператор не работает NodeJS, используя mongoc - PullRequest
0 голосов
/ 26 сентября 2018

Я прочитал документацию MongoDB и есть оператор "$ regex".В настоящее время я делаю привязку NodeJS для драйвера, написанного на C ++, который использует 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 для обратной совместимости.У кого-нибудь есть правильный синтаксис?

1 Ответ

0 голосов
/ 09 октября 2018

о, привет, я автор bsonsearch!

edit- Открыл комнату для обсуждения https://chat.stackoverflow.com/rooms/181623/bsonsearch

edit2: похоже, вы пытаетесь использовать расширенный JSON с $ regex, но кодируете в биты BSON.Нам нужно будет выбрать один или другой и использовать соответствующий bson_new_from_ * на стороне C, чтобы десериализовать его.

Мой код на самом деле не имеет ничего общего с mongo-c-драйвером, кроме использования некоторого их кода.Это отдельный проект, предназначенный для сопоставления документов на стороне клиента.

Если вы знаете, что не пытаетесь подключить bsoncompare к mongodb, вам нужно использовать двоичный формат регулярных выражений mongodb непосредственно в строке, если вы собираетесь использовать его таким образом.

bsonsearchregex shcema происходит непосредственно из схемы регулярных выражений mongodb (разделение $ regex от $ options) 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

...