c# - 使用 MongoDB 中的文档属性过滤器获取嵌入数组中的扁平文档数组
问题描述
我有一个 MongoDb 文档集合,每个文档都包含一组嵌入文档。我想检索日期属性在给定日期之前的那些嵌入文档的扁平列表。
假设我们有以下类:
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
}
]
}
我已经阅读了文档,我在这里阅读了很多,但到目前为止我最接近的是:
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 和 Name 设置为 null,Date 设置为 1/1/0001。
如何检索我的集合中日期属性早于/小于给定日期的所有预订的扁平列表?
解决方案
我想如果你使用
collection.AsQueryable().SelectMany(s => s.Reservations).Where(r => r.Date > thresholdDate).ToList();
它应该返回您所期望的。
推荐阅读
- android - Firebase Firestore toObject()不适用于数据类
- java - 选择降序排序 - JAVA
- angular - Angular Popup 组件不允许访问 confirmNo/confirmYes
- python - pip3 install mysql-python 在 Mac 上失败
- python - 来自 buildozer 的 Kivy Apk 文件崩溃
- java - 初始化存储在数组中的对象的变量
- c++ - 如何克服 UDP 客户端的延迟
- python - 继续收到错误:'urllib.error.HTTPError:HTTP 错误 400:错误请求'
- kubernetes - 优先选择某些节点直到满
- php - 如何在登录该人之前使我的recaptcha需要