使用 c# Mongodb 驱动程序查询和投影嵌套数组
query and project a nested array using the c# Mongodb driver
您好,我正在尝试学习如何将 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; }
}
嵌套数据可能非常大。
我想查询集合 return 一个日期范围内所有嵌套数据的列表(理想情况下将来自多个快照的数据连接在一起,但只有一个是一个好的开始)
我正在努力研究如何正确地过滤和投影它。我阅读了有关如何过滤以及如何过滤和投影的示例,但我正在努力使其在所有这些条件下都有效
我正在尝试做这样的事情:
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
}
}
]
因此整个筛选将在数据库中执行。
您好,我正在尝试学习如何将 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; }
}
嵌套数据可能非常大。
我想查询集合 return 一个日期范围内所有嵌套数据的列表(理想情况下将来自多个快照的数据连接在一起,但只有一个是一个好的开始)
我正在努力研究如何正确地过滤和投影它。我阅读了有关如何过滤以及如何过滤和投影的示例,但我正在努力使其在所有这些条件下都有效
我正在尝试做这样的事情:
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
}
}
]
因此整个筛选将在数据库中执行。