Как запросить / обновить вложенный документ в MongoDB с помощью драйвера C #

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. Как получить один документ HourData из коллекции DayData (с помощью одного запроса к базе данных)? например Мне нужно получить документ HourData HR1 для DayData (где _id = "2012_11_10"). Пожалуйста, обратитесь к фрагменту кода, который я пробовал, как Edit-1.

  2. Как обновить / добавить документ HourData, чтобы увеличить его счетчик (с помощью одной операции с базой данных, например collection.update (Query, Update))? например Мне нужно увеличить количество HR1 для DayData (где _id = "2012_11_10").

  3. Как получить сумму всех значений Count HR1, HR2, ..., HR24 для DayData (где _id = "2012_11_10") (с помощью некоторой агрегатной функции).

  4. Как лучше всего преобразовать HourData Counts всех часов в массив (для любых DayData). например для DayData с _id = "2012_11_10" мне нужно:

    int [] Количество = [100,200,300, ..., 2400]

Редактировать-1

С помощью этого кода я намерен получить HourData для HR1, где его _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);'

person theGeekster    schedule 14.11.2012    source источник
comment
1 и 2 довольно просты. Вы просмотрели документы и попробовали? Разместите свой код и то, что с ним не работает.   -  person JohnnyHK    schedule 14.11.2012
comment
Пожалуйста, обратитесь к Edit-1 выше   -  person theGeekster    schedule 14.11.2012
comment
В вашем вопросе упоминается коллекция DayData, но затем вы запрашиваете коллекцию HourData в своем коде. Здесь одна или две коллекции?   -  person JohnnyHK    schedule 15.11.2012


Ответы (1)


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

Или вы можете создать перечислитель прямо в классе, но я думаю, что в вашем случае это излишне.

person Kath    schedule 20.11.2012