BsonSerializer и обычный express - PullRequest
1 голос
/ 29 мая 2020

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

определение фильтра создается

var bson = BsonSerializer.Deserialize<BsonDocument>(query);
var definition = new BsonDocumentFilterDefinition<CellDo>(bson);

Запрос выглядит следующим образом:

{
   "description": {
      "$regex": /\w*\.a\b/
   }
}

Но когда запрос передан, сериализатор выдает исключение, говоря: JSON reader expected a string but found '/\\w*\\.a\\b/'.

Я пытался обернуть регулярное выражение в строки - выражение обрабатывается как строка, поэтому на самом деле не помогает и я также заключил выражение в вызов RegEx, но он просто выбросил исключение JSON reader expected a string but found 'RegExp'.

Запросы выглядят так:

{
    "description": {
        "$regex": "/\w*\.a\b/"
    }
}
{
    "description": {
        "$regex": RegExp(/\w*\.a\b/, "")
    }
}

В настоящее время мы используем mon go из docker изображение mongo:4.2.6-bionic и MongoDB.Driver 2.10.3

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Итак, я решил, что вот решение:

Вам нужно принять ваш запрос как строку. Нет никакого способа, чтобы System.Text. Json или Newtosoft. Json могли проанализировать это в какой-то красивый объект.

Тогда ваш запрос должен использовать следующий синтаксис

{
    "description": /\w*\.a\b/
}

Там на самом деле есть три способа записать этот запрос. Но в драйвере do tnet работает только этот. (Эти два других находятся в вопросе)

Затем вам нужно проанализировать ваш запрос в BsonDocument или BsonArray, когда вы работаете с таким конвейером

var bson = BsonSerializer.Deserialize<BsonDocument>(query);
var bsonPipeline = BsonSerializer.Deserialize<BsonArray>(pipeline);
0 голосов
/ 04 июня 2020

Ваша строка запроса должна выглядеть следующим образом:

var query = @"{
   ""description"": {
      ""$regex"": ""/\\w*\\.a\\b/""
   }
};";

обратите внимание, что регулярное выражение заключено в кавычки, и вам также необходимо экранировать "\" в строке для регулярного выражения.

Вы можете проверить это с помощью следующего кода

var bson = BsonSerializer.Deserialize<BsonDocument>(query);

var regex = bson["description"].AsRegex;
Console.WriteLine($"regex: {regex}"); // regex: /\w*\.a\b/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...