如何使用C#驱动程序在MongoDB中查询/更新子文档

时间:2012-11-14 02:48:18

标签: mongodb select document mongodb-.net-driver updates

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. 如何更新/ upsert HourData文档以增加其Count(使用单个数据库操作,如:collection.update(Query,Update))?例如我需要为DayData增加HR1的计数(其中_id =" 2012_11_10")。

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

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

    int []计数= [100,200,300,...,2400]

  5. 修改-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);'
    

1 个答案:

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

或者你可以在课堂上创建枚举器,但我认为你的情况有点过分。