C# MongoDB.Driver Aggregation с Project не возвращает поле _id - PullRequest
0 голосов
/ 06 августа 2020

моя проблема - запрос к документу в этом формате:

{
    "_id" : NumberLong(21),
    "_t" : "Detail",
    "Name": "Bank Z",
    "DeletionDate" : null,
    "CreationDate" : ISODate("2017-11-16T13:29:10.160Z"),
    "UpdateDate" : ISODate("2017-11-16T13:29:10.160Z"),
    "Accounts" : [ 
        {
            "Bank" : "123",
            "BankAccount" : "123456"
        }
    ]
}

, и у меня есть эта структура классов

Detail.cs

[BsonDiscriminator("Detail")]
public class Detail
{

     public virtual long? Id { get; set; }
     public string Name { get; set; }

     [BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
     public DateTime? DeletionDate { get; set; }

     [BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
     public DateTime? CreationDate { get; set; }

     [BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
     public DateTime? UpdateDate { get; set; }
     
     private IEnumerable<Account> _accounts;

     public IEnumerable<Account> Accounts {
         get
         {
             if (_accounts == null)
                 return new List<Account>();
             return _accounts;
         }
         set { _accounts = value;  } 
     }

}

и

Account.cs

public class Account
{
    public string Bank { get; set; }

    public string BankAccount { get; set; }
}

Запрос

...
Collection.Aggregate().Match(filter).Project(det =>
                    new Details
                    {
                        Id = det.Id,
                        Name = det.Name,
                        UpdateDate = det.UpdateDate,
                        Accounts = det.Accounts.Where(x => x.Bank.Equals(Bank))
                    }).FirstOrDefault();

с помощью этого запроса я могу приносят почти все данные, предварительно заполненные в экземпляре объекта, но не заполняется ни _id, ни UpdateDate. Посмотрев на github проекта MongoDB.Driver, я увидел, кто в данный момент в методе Render удаляет поле _id. Мне было интересно, есть ли способ изменить это, и кто знает, как узнать цель ...

в mongodb запрос будет таким:

db.getCollection('Detail').aggregate([
{ $match: { _id: 21 } },
{ 
    $project: { 
         
        UpdateDate: 1, 
        Name: 1, 
        SpecificAccounts: { $filter: { input: "$SpecificAccounts", as: "x", cond: { $eq: [ "$$x.Bank", "123" ] } } }
    }
}
])

1 Ответ

0 голосов
/ 07 августа 2020

Мне удалось решить, изменив весь запрос на LINQ, я считаю, что внутри драйвер использует другой метод рендеринга.

 var q = from det in Collection.AsQueryable()
                    where det.Id == 21
                    select new Details
                    {
                        Id = det.Id,
                        Name = det.Name,
                        SpecificAccounts = det.SpecificAccounts.Where(x => x.Bank.Equals(getAccountDTO.Bank))
                    };

var resp = q.ToList().FirstOrDefault();
...