2015-09-10 3 views
5

У меня есть запрос агрегации в драйвере C# как это:

var result = await _records.Aggregate() 
       .Match(record => record.Statuses.Any(status => status.Status == currentStatus)) 
       .Unwind(record => record.Statuses) 
       .Sort(Builders<BsonDocument>.Sort.Descending("statuses.date")) 
       .Group(doc => doc["_id"], group => new { Id = group.Key, CurrentStatus = group.First()["statuses"] }) 
       .Match(arg => arg.CurrentStatus["status"] == BsonValue.Create(currentStatus.ToString())) 
       .ToListAsync(); 

, который соответствует следующему синтаксису оболочки:

db.records.aggregate(
    [ 
     { 
      $match : { "statuses.status" : "Finished" } 
     }, 
     { 
      $unwind: "$statuses" 
     }, 
     { 
      $sort: { "statuses.date":-1 } 
     }, 
     { 
      $group: { 
       _id: "$_id", 
       current_status: { $first: "$statuses" } 
      } 
     }, 
     { 
      $match : { "current_status.status" : "Finished" } 
     } 
    ]) 

Я думаю, C# версии не работает из-за CurrentStatus = group.First()["statuses"] и исключением является:

System.NotSupportedException: get_Item of type MongoDB.Bson.BsonValue is an unsupported method in a $project or $group pipeline operator. 

Мой подход к First() конвенция основана на этом:

MongoDB C# Driver First Expression Reference

Любые идеи о том, чтобы перевести его в пути водитель любит?

ответ

1

После игры вокруг с подобным, например, для немного, похоже, что вы можете сделать это первым вызовом Select на вашей группе, чтобы получить statuses поле, а затем вызвать First() на том, что:

var result = await _records.Aggregate() 
    .Match(record => record.Statuses.Any(status => status.Status == currentStatus)) 
    .Unwind(record => record.Statuses) 
    .Sort(Builders<BsonDocument>.Sort.Descending("statuses.date")) 
    .Group(doc => doc["_id"], group => new 
    { 
     Id = group.Key, 
     CurrentStatus = group.Select(x => x["statuses"]).First() 
    }) 
    .Match(arg => arg.CurrentStatus["status"] == BsonValue.Create(currentStatus.ToString())) 
    .ToListAsync(); 
Смежные вопросы