Есть ли способ отправить запрос, выраженный в синтаксисе запроса оболочки, к драйверу mongo C #
Например, что-то вроде
Coll.find { "myrecs","$query : { x : 3, y : "abc" }, $orderby : { x : 1 } } ");
Взять пример из руководства по оболочке
Класс QueryComplete, похоже, устарел. Используйте вместо этого MongoDB.Driver.QueryDocument
. Как показано ниже:
BsonDocument document = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<BsonDocument>("{ name : value }");
QueryDocument queryDoc = new QueryDocument(document);
MongoCursor toReturn = collection.Find(queryDoc);
Вот несколько подпрограмм, которые я использую для преобразования из строки и объектов .NET в запросы BSON (это часть оболочки бизнес-объекта, поэтому пара ссылок на этот класс):
public QueryDocument GetQueryFromString(string jsonQuery)
{
return new QueryDocument(BsonSerializer.Deserialize<BsonDocument>(jsonQuery));
}
public IEnumerable<T> QueryFromString<T>(string jsonQuery, string collectionName = null)
{
if (string.IsNullOrEmpty(collectionName))
collectionName = this.CollectionName;
var query = GetQueryFromString(jsonQuery);
var items = Database.GetCollection<T>(collectionName).Find(query);
return items as IEnumerable<T>;
}
public IEnumerable<T> QueryFromObject<T>(object queryObject, string collectionName = null)
{
if (string.IsNullOrEmpty(collectionName))
collectionName = this.CollectionName;
var query = new QueryDocument(queryObject.ToBsonDocument());
var items = Database.GetCollection<T>(collectionName).Find(query);
return items as IEnumerable<T>;
}
Использование это довольно просто сделать запрос через строку или парс объекта:
var questionBus = new busQuestion();
var json = "{ QuestionText: /elimination/, GroupName: \"Elimination\" }";
var questions = questionBus.QueryFromString<Question>(json);
foreach(var question in questions) { ... }
или используя синтаксис объекта:
var questionBus = new busQuestion();
var query = new {QuestionText = new BsonRegularExpression("/elimination/"),
GroupName = "Elimination"};
var questions = questionBus.QueryFromObject<Question>(query);
foreach(var question in questions) { ... }
Мне нравится синтаксис объекта просто потому, что его немного легче записать в C # код, чем работа со встроенными кавычками в строках JSON, если они закодированы вручную.