public class DayData
{
public string _id
{get;set;}
public string Data
{get;set;}
public HourData HR1
{get;set;}
public HourData HR2
{get;set;}
...
public HourData HR24
{get;set;}
}
public class HourData
{
public long _id
{get;set;}
public int Count
{get;set;}
public string Data
{get;set;}
}
//示例数据
{
"_id": "2012_11_10",
"Data": "some data",
"HR1":
{
"_id": 1
"Count": 100,
"Data": "Hour 1 Data"
},
"HR2":
{
"_id": 2
"Count": 200,
"Data": "Hour 2 Data"
},
...
"HR24":
{
"_id": 24
"Count": 2400,
"Data": "Hour 24 Data"
}
}
我有以下问题(使用C#官方驱动程序):
如何从DayData集合中检索单个HourData文档(使用单个数据库查询)?例如我需要为DayData检索HR1的HourData文档(其中_id =" 2012_11_10")。请参阅我作为Edit-1尝试的代码段。
如何更新/ upsert HourData文档以增加其Count(使用单个数据库操作,如:collection.update(Query,Update))?例如我需要为DayData增加HR1的计数(其中_id =" 2012_11_10")。
如何检索DayData的HR1,HR2,...,HR24的所有Count值的总和(其中_id =" 2012_11_10")(使用某些聚合函数)。
将所有小时的HourData Counts转换为数组(对于任何DayData)的最佳方法是什么。例如对于具有_id =" 2012_11_10"的DayData,我需要:
int []计数= [100,200,300,...,2400]
修改-1
使用此代码,我打算获取HR1的HourData,其_id = 1,DayData为_id =" 2012_11_10",但它不会返回任何内容。
MongoCollection<HourData> dayInfo = mdb.GetCollection<HourData>("HourData");
var query = Query.And(Query.EQ("_id", "2012_11_10"), Query.EQ("HR1._id", 1));
MongoCursor<HourData> hri = dayInfo.Find(query);'
答案 0 :(得分:2)
1)
QueryComplete = Query.EQ(_id, "2012_11_10");
DayData myData = db.GetCollection<DayData>("DayDataCollection").FindOne(query);
// As HourData is the class member you can retrieve it from the instance of the DayData:
HourData myHour = myData.HR1;
2)
QueryComplete = Query.EQ(_id, "2012_11_10");
UpdateBuilder update = Update.Inc("HR1.Count", 1);
db.GetCollection<DayData>("DayDataCollection").Update(query, update, SafeMode.True)
3) 在您的情况下,您只需检索DayData实例,然后明确地汇总所有需要的值:
QueryComplete = Query.EQ(_id, "2012_11_10");
DayData myData = db.GetCollection<DayData>("DayDataCollection").FindOne(query);
// As HourData is the class member you can retrieve it from the instance of the DayData:
int sum = myData.HR1.Count + myData.HR2.Count + ... + myData.HR24.Count;
但它并不优雅。如果您需要优雅的解决方案,您需要将字段转换为数组,如:
DayData
{
HR:
[{
Count: 1,
Data: "Hour 1 data"
},
{
},
...
]
}
和数组一样工作。如果可以将其转换为数组,请告诉我。
4) 在您的情况下,再次,没有任何优雅的解决方案。您可以做的只是浏览您的字段并创建一个数组:
int[] Counts = new int[24];
Counts[0] = myData.HR1.Count;
...
或者你可以在课堂上创建枚举器,但我认为你的情况有点过分。