Подтвердить что ты не робот

Запросы С# mongo с json-строками

Это кажется настолько основным, что я уверен, что я просто упустил класс или метод где-то, но для жизни меня это не может найти.

У меня есть строка json, например:

{ SendId: 4, "Events.Code" : { $all : [2], $nin : [3] } }

Я могу запустить это в оболочке mongo с помощью find() или count() и получить то, что я ищу. Каков самый простой способ справиться с этим в С#? Вот что я нашел:

  • Методы, которые я нахожу, все хотят IMongoQuery, который является только интерфейсом маркера
  • BsonDocument имеет хороший метод Parse, но он не реализует IMongoQuery
  • QueryDocument наследует от BsonDocument, и он реализует IMongoQuery, но у него нет собственного метода Parse, и я не могу преобразовать QueryDocument в BsonDocument
  • Структура агрегации принимает BsonDocument [], но иногда мне просто нужна простая операция поиска или подсчета
  • Некоторые из этих запросов являются большими и грубыми, и я не хочу строить их в строке с классом Query builder

Если база данных имеет дело с json-документами, и я могу запустить этот материал в оболочке, нет ли способа запустить его через драйвер?

4b9b3361

Ответ 1

Это некрасиво, но вы можете сделать это, десериализируя строку в BsonDocument, а затем обернув в QueryDocument

BsonDocument query = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>("{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }");
QueryDocument queryDoc = new QueryDocument(query);
var result = collection.FindAs<TypeOfResultExpected>(queryDoc); // or just use Find

Если вы что-то планируете делать часто, вы всегда можете обернуть его в методе или создать класс JSQueryDocument следующим образом:

public class JSQueryDocument : QueryDocument
{
    public JSQueryDocument(string query) : base(MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>(query))
    {
        // Probably better to do this as a method rather than constructor as it
        // could be hard to debug queries that are not formatted correctly
    }
}

/// ...

var result = collection.Find(new JSQueryDocument("{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }"));

Ответ 2

Чтобы добавить к Shaun McCarthy ответ, есть несколько более чистый способ достичь той же цели, используя BsonDocument.Parse вместе с QueryDocument:

var json = "{ SendId: 4, 'Events.Code' : { $all : [2], $nin : [3] } }";
collection.Find(new QueryDocument(BsonDocument.Parse(json)));