Проблема, с которой вы сталкиваетесь, может быть в основном упрощена до строки кода ниже:
var agg = collection.Aggregate().Project(x => x.Tag);
Где Tag
- это свойство string
в вашей модели.
Похоже, что Aggregate()
и все операторы драйвера MongoDB ближе к Aggregation Framework, чем позволяет им синтаксис C#.
На основе вашего кода предполагается, что переменная result
имеет тип String
, который переводится драйвером в MongoDB.Bson.BsonString
, однако Aggregation Framework всегда возвращает документы BSON (в данном случае один), поэтому MongoDB . NET драйвер не может обработать такую десериализацию во время выполнения (BsonDocument -> BsonString
).
Первый обходной путь очевиден - возвращает все, что напоминает документ BSON и может быть десериализовано из типа BsonDocument
, например:
collection.Aggregate().Project(x => new { x.Tag });
, а затем сопоставить результаты в памяти (тот же запрос выполняется за кулисами)
Другой подход: перевести запрос в LINQ, используя .AsQueryable()
, что позволяет более гибко возвращать результаты:
collection.AsQueryable().Select(x => x.Tag);
В обоих случаях запрос, сгенерированный для моей проекции, выглядит одинаково:
{aggregate([{ "$project" : { "Tag" : "$Tag", "_id" : 0 } }])}