Оператор MongoDB $ regex не работает NodeJS с использованием mongoc

Я прочитал документацию 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 для проблем с обратной совместимостью. У кого-нибудь есть правильный синтаксис?

1) Ваша альтернатива похожа на оригинал, это ошибка при публикации? 2) Какой mongoc-matcher вы имеете в виду? 3) Какую версию драйвера MongoDB C вы используете?

Wan Bachtiar 09.10.2018 06:36

@WanBachtiar 1) Я отредактировал свой альтернативный код, извините ... Мне нужно использовать $regex, а не $eq new RegExp() для обратной совместимости. 2 - 3) Я использую эту версию с bsoncompare: github.com/bauman/bsonsearch/tree/… Большое спасибо, что нашли время, чтобы помочь мне

Aurélien Foucault 09.10.2018 10:25

Похоже, что @ baumann.space, автор использования bsonsearch меня обыграл. ;)

Wan Bachtiar 10.10.2018 00:46

@WanBachtiar Я не уверен, что этот вопрос связан с bsonsearch. Как написано, db.find (...) - это вопрос nodejs / mongodb. У меня там ограниченные знания. Ошибка OP выглядит как повышенная ошибка node.js

bauman.space 10.10.2018 16:21
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
235
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

о привет, я автор 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) {});

Aurélien Foucault 10.10.2018 14:15

db.find (...) выглядит как функция mongodb. Вы работаете с mongodb или bsonsearch?

bauman.space 10.10.2018 15:49

Если mongodb, попробуйте удалить BSON.serialize - сделайте ...db.find({foo: {"$regex": ".", "$options": "i"}})

bauman.space 10.10.2018 15:55

db.find - это привязка, сделанная мной для вызова кода C++. Которые вызывают функции mongoc-matcher в bsonsearch, такие как mongoc_matcher_match() или mongoc_matcher_new(). Ошибка возникает из-за этих функций

Aurélien Foucault 10.10.2018 16:28

очень круто. Имеется ли привязка с открытым исходным кодом? Вы должны вызывать функции, похожие на привязку python. В bsoncompare.c есть помощники, которые могут принимать символьную строку и преобразовывать ее в libbson.

bauman.space 10.10.2018 18:01

прояснив, вы делали что-то похожее на эту функцию? создать новый объект bson из json с помощью bson_new_from_json и передать этот объект в _matcher_new? github.com/bauman/bsonsearch/blob/master/lib/…

bauman.space 10.10.2018 18:13

открыл комнату, чтобы избежать спама в чате - chat.stackoverflow.com/rooms/181623/bsonsearch

bauman.space 10.10.2018 18:27

У меня недостаточно репутации, чтобы говорить в этой комнате: /. На данный момент это не открытый исходный код: /. Я mka emy bson из bson_seralize в JS, и я получаю его с V8 в моем коде C++, и я использую bson_new_from_data() для создания структуры bson_t.

Aurélien Foucault 11.10.2018 09:57

{$ 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

bauman.space 11.10.2018 15:53

Удачи с любым методом?

bauman.space 16.10.2018 18:50

Использование json вносит много изменений в наш код, и это не является настоящим приоритетом. Так что сделаю это позже. Сожалею об этом :/

Aurélien Foucault 16.10.2018 22:54

не беспокойтесь, вы пробовали db.find(bson.serialize({"foo": new RegEx(".", "i")})) на стороне узла ... опуская "$ regex", и это не сработало?

bauman.space 17.10.2018 19:02

Наконец, я реализую $ regex в mongoc-matche как оператор, и он работает как шарм.

Aurélien Foucault 30.10.2018 10:57

рад что сработало! канал бесплатно, чтобы отмечать проблемы, которые вы найдете на странице проекта, если это необходимо

bauman.space 30.10.2018 19:46

Другие вопросы по теме