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 (_id="2012_11_10") の HR1 の HourData ドキュメントを取得する必要があります。Edit-1として試したコードスニペットを参照してください。

  2. HourData ドキュメントを更新/アップサートしてカウントをインクリメントする方法 ( collection.update(Query, Update) のような単一のデータベース操作を使用)? たとえば、DayData (_id="2012_11_10") の HR1 のカウントをインクリメントする必要があります。

  3. DayData (_id="2012_11_10") の HR1、HR2、...、HR24 のすべてのカウント値の合計を取得する方法 (集計関数を使用)。

  4. すべての時間の HourData カウントを配列に変換する最良の方法は何ですか (DayData の場合)。たとえば、_id="2012_11_10" の DayData の場合、次のものが必要です。

    int []カウント = [100,200,300, ... , 2400]

編集-1

このコードでは、_id=1 の HR1 の HourData と _id="2012_11_10" の DayData を取得しようとしていますが、何も返されません。

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 に答える