Запросы С# 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-документами, и я могу запустить этот материал в оболочке, нет ли способа запустить его через драйвер?
Ответы
Ответ 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)));