1
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# 官方驱动程序):

  1. 如何从 DayData 集合中检索单个 HourData 文档(使用单个数据库查询)?例如,我需要为 DayData 检索 HR1 的 HourData 文档(其中 _id="2012_11_10")。请参阅我尝试作为 Edit-1 的代码片段。

  2. 如何更新/更新 HourData 文档以增加其计数(使用单个数据库操作,例如:collection.update(Query, Update))?例如,我需要增加 DayData 的 HR1 计数(其中 _id="2012_11_10")。

  3. 如何检索 DayData 的 HR1、HR2、...、HR24 的所有计数值的总和(其中 _id="2012_11_10")(使用一些聚合函数)。

  4. 将所有小时的 HourData 计数转换为数组(对于任何 DayData)的最佳方法是什么。例如,对于 _id="2012_11_10" 的 DayData,我需要:

    int []Counts = [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);'
4

1 回答 1

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;
...

或者您可以在课堂上直接创建枚举器,但我认为在您的情况下这太过分了。

于 2012-11-20T18:46:48.397 回答