嗨,我正在学习如何将mongoDb与c#驱动程序一起使用。我有一个类似的收藏:
public class DataSnapshot
{
[BsonId]
public ObjectId InternalId { get; set; }
public Int Id { get; set; }
public string Identifier1 { get; set; }
public string Identifier2 { get; set; }
public List<NestedData> NestedData { get; set; }
}
和
public class NestedData
{
public DateTime TimeStamp { get; set; }
public double Info1 { get; set; }
public double Info2 { get; set; }
}
嵌套的数据可能非常大。
我想查询集合以返回一个日期范围内所有嵌套数据的列表(理想情况下,将多个快照中的数据连接在一起,但只有一个快照是一个好的开始(
我很难弄清楚如何正确地过滤和投影它。我读过关于如何过滤、如何过滤和投影的例子,但我很难在的所有这些条件下都能做到这一点
我正在尝试做这样的事情:
context.DataSnapshot.Find(x => x.Identifier1 == "foo" && x.Identifier2 == "bar" && x.NestedData.Timestamp > DateTime.Now.AddYears(-1)).Project(x => x.NestedData).ToList();
最好的方法是什么?
感谢
您可以使用LINQ查询:
var q = from doc in col.AsQueryable()
where doc.Identifier1 == "foo" && doc.Identifier2 == "bar"
select doc.NestedData
into nested
from nestedDoc in nested
where nestedDoc.TimeStamp > DateTime.Now.AddYears(-1)
select nestedDoc;
var results = q.ToList();
它被翻译成以下MongoDB聚合:
[
{
"$match" : {
"Identifier1" : "foo",
"Identifier2" : "bar"
}
},
{
"$project" : {
"NestedData" : "$NestedData",
"_id" : 0
}
},
{
"$unwind" : "$NestedData"
},
{
"$project" : {
"nested" : "$NestedData",
"nestedDoc" : "$NestedData",
"_id" : 0
}
},
{
"$match" : {
"nestedDoc.TimeStamp" : {
"$gt" : ISODate("2019-04-24T23:36:42.519Z")
}
}
},
{
"$project" : {
"nestedDoc" : "$nestedDoc",
"_id" : 0
}
}
]
因此,整个筛选将在数据库中执行。