Я прочитал документацию MongoDB, есть оператор «$ regex». В настоящее время я выполняю привязку NodeJS для драйвера, написанного на C++, который использует bsonsearch. Я использую этот код в NodeJS:
db.find(bson.serialize({foo: {$regex: new RegExp('.', 'i')}}), function (err, docs) {
//things
});
Он проходит через C++ и обрабатывается mongoc-matcher. Но mongoc-matcher вернул мне ошибку:
Invalid operator "$regex"
Итак, я искал альтернативу и вижу, что это работает:
db.find(bson.serialize({foo: {$eq: new RegExp('.', 'i')}}), function (err, docs) {
//things
});
Но мне нужно иметь дело с оператором $ regex для проблем с обратной совместимостью. У кого-нибудь есть правильный синтаксис?
@WanBachtiar 1) Я отредактировал свой альтернативный код, извините ... Мне нужно использовать $regex, а не $eq new RegExp() для обратной совместимости. 2 - 3) Я использую эту версию с bsoncompare: github.com/bauman/bsonsearch/tree/… Большое спасибо, что нашли время, чтобы помочь мне
Похоже, что @ baumann.space, автор использования bsonsearch меня обыграл. ;)
@WanBachtiar Я не уверен, что этот вопрос связан с bsonsearch. Как написано, db.find (...) - это вопрос nodejs / mongodb. У меня там ограниченные знания. Ошибка OP выглядит как повышенная ошибка node.js



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


о привет, я автор bsonsearch!
edit - Открыта комната для обсуждения https://chat.stackoverflow.com/rooms/181623/bsonsearch
edit2: похоже, вы пытаетесь использовать расширенный JSON с $ regex, но кодируете биты BSON. Нам нужно будет выбрать один или другой и использовать соответствующий bson_new_from_ * на стороне C, чтобы десериализовать его.
Мой код на самом деле не имеет ничего общего с mongo-c-driver, кроме использования некоторого их кода. Это отдельный проект, предназначенный для согласования документов на стороне клиента.
Предполагая, что вы знаете это и не пытаетесь подключить bsoncompare к mongodb, вам нужно будет использовать двоичный формат регулярного выражения mongodb непосредственно в строке, если вы собираетесь использовать его таким образом.
bsonsearch regex 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
Рад тебя видеть !! Когда я попробовал ваш синтаксис, он отправил мне ту же ошибку: AssertionError [ERR_ASSERTION]: 'Invalid operator "$regex"' == null. Я написал это: db.find(bson.serialize({foo: {"$regex": ".", "$options": "i"}}), function (err, docs) {});
db.find (...) выглядит как функция mongodb. Вы работаете с mongodb или bsonsearch?
Если mongodb, попробуйте удалить BSON.serialize - сделайте ...db.find({foo: {"$regex": ".", "$options": "i"}})
db.find - это привязка, сделанная мной для вызова кода C++. Которые вызывают функции mongoc-matcher в bsonsearch, такие как mongoc_matcher_match() или mongoc_matcher_new(). Ошибка возникает из-за этих функций
очень круто. Имеется ли привязка с открытым исходным кодом? Вы должны вызывать функции, похожие на привязку python. В bsoncompare.c есть помощники, которые могут принимать символьную строку и преобразовывать ее в libbson.
прояснив, вы делали что-то похожее на эту функцию? создать новый объект bson из json с помощью bson_new_from_json и передать этот объект в _matcher_new? github.com/bauman/bsonsearch/blob/master/lib/…
открыл комнату, чтобы избежать спама в чате - chat.stackoverflow.com/rooms/181623/bsonsearch
У меня недостаточно репутации, чтобы говорить в этой комнате: /. На данный момент это не открытый исходный код: /. Я mka emy bson из bson_seralize в JS, и я получаю его с V8 в моем коде C++, и я использую bson_new_from_data() для создания структуры bson_t.
{$ regex: ...} - это расширенный JSON, недействительный BSON., если вы используете bson_new_from_data, ваш код node.js должен быть db.find(bson.serialize({"foo": new RegEx(".", "i")})), если вам нужно использовать эксплицитность $ regex, вам нужно db.find(json.dumps({"foo": {$regex: ".", $options: "i")}})) и использовать bson_new_from_json на сторона C++ --- docs.mongodb.com/manual/reference/mongodb-extended-json
Удачи с любым методом?
Использование json вносит много изменений в наш код, и это не является настоящим приоритетом. Так что сделаю это позже. Сожалею об этом :/
не беспокойтесь, вы пробовали db.find(bson.serialize({"foo": new RegEx(".", "i")})) на стороне узла ... опуская "$ regex", и это не сработало?
Наконец, я реализую $ regex в mongoc-matche как оператор, и он работает как шарм.
рад что сработало! канал бесплатно, чтобы отмечать проблемы, которые вы найдете на странице проекта, если это необходимо
1) Ваша альтернатива похожа на оригинал, это ошибка при публикации? 2) Какой
mongoc-matcherвы имеете в виду? 3) Какую версию драйвера MongoDB C вы используете?