在MongoDB中使用文档属性过滤器获取嵌入数组的扁平文档数组

时间:2019-02-02 17:38:43

标签: c# .net mongodb mongodb-query mongodb-.net-driver

我有一个MongoDb文档集合,每个文档包含一组嵌入式文档。我想检索其date属性在给定日期之前的那些嵌入式文档的扁平列表。

让我们假设有下面的类:

public class RootItem
{
    public string Id { get; set; }
    public string Name{ get; set; }
    public string PictureUrl { get; set; }
    public List<Reservation> Reservations { get; set; }
}

public class Reservation
{
    public string Name { get; set; }
    public DateTime Date{ get; set; }
    public int NrOfSeats { get; set; }
}

因此,收集将是这个样子:

{
  "_id": "5be2bb2fdfd6174938518af2",
  "name": "John Doe",
  "pictureUrl": "http://example.com/abc.jpg",
  "reservations": [
    {
      "table": "abc",
      "date": "1/1/2019",
      "nrOfSeats": 5
    },
    {
      "name": "xyz",
      "date": "7/1/2019",
      "nrOfSeats": 5
    }
  ]
}

我读过的文档,我读过很多在这里SO,但我得到这个最接近到目前为止是这样的:

var reservations = Collection
            .Aggregate()
            .Unwind<RootItem, Reservation>(x => x.Reservations)
            .ToList()
            .FindAll(r => r.Date > thresholdDate);

运行该代码我得到这个错误:

System.FormatException:'元素'_id'与类'Reservation'的任何字段或属性都不匹配

所以我添加一个投影。如果仅排除 _id 字段,则会得到:

“元素 '创建' 不匹配任何字段或一类属性 '预约'

因此,我手动添加了其他字段(应该没有必要):

var reservations = Collection
            .Aggregate()
            .Unwind<RootItem, Reservation>(x => x.Reservations)
            .Project<Reservation>(Builders<Reservation>.Projection
                 .Exclude("_id")
                 .Include(r => r.Name)
                 .Include(r => r.Date)
                 .Include(r => r.NrOfSeats))
            .ToList()
            .FindAll(r => r.Date > thresholdDate);

但是现在我得到一个列表,其中NrOfSeats的名称设置为null,日期设置为1/1/0001。

如何检索其集合中date属性在给定日期之前/小于给定日期的所有预订的扁平化列表?

1 个答案:

答案 0 :(得分:1)

我认为如果您使用

collection.AsQueryable().SelectMany(s => s.Reservations).Where(r => r.Date > thresholdDate).ToList();

它应该返回您的期望。