Mongodb сохранить / сохранить с помощью драйверов C #, непрерывного добавления массивов и обновления полей в том же документе - PullRequest
1 голос
/ 25 февраля 2012

Мне нужны некоторые идеи / советы для этого. Вот пример документа, который я храню:

{
    "_id" : new BinData(0, "C3hBhRCZ5ZFizqbO1hxwrA=="),
    "gId" : 237,
    "name" : "WEATHER STATION",
    "mId" : 341457,
    "MAC" : "00:00:00:00:00:01",
    "dt" : new Date("Fri, 24 Feb 2012 13:59:02 GMT -05:00"),
    "hw" : [{
        "tag" : "Weather Sensors",
        "snrs" : [{
          "_id" : NumberLong(7),
          "sdn" : "Wind Speed"
        }, {
          "_id" : NumberLong(24),
          "sdn" : "Wind Gust"
        }, {
          "_id" : NumberLong(28),
          "sdn" : "Wind Direction"
        }, {
          "_id" : NumberLong(31),
          "sdn" : "Rainfall Amount"
        }, {
          "_id" : NumberLong(33),
          "sdn" : "Rainfall Peak Amount"
        }, {
          "_id" : NumberLong(38),
          "sdn" : "Barometric Pressure"
        }],
      "_id" : 1
    }]
}

То, что я сейчас делаю, - это использование драйвера C # и выполнение .Save () для моей коллекции, но я хочу, чтобы мне показался гибридный подход. Вот отдельные операции, которые мне нужно выполнить:

  1. Сохранить весь документ, если он не существует
  2. Обновите поле dt новой отметкой времени, если документ существует
  3. Для поля hw мне нужно несколько вещей здесь. Если hw._id существует, обновите его поле тега, а также обработайте поле snrs, либо обновив существующие записи, чтобы обновить значение sdn, либо добавив совершенно новые значения, когда _id не существует

Ничто не должно быть удалено из массива hw, и ничто не должно быть удалено из массива snrs.

Стандартный upsert не дает мне того, чего я добиваюсь, поэтому я ищу лучший способ сделать то, что мне нужно, с минимальным количеством обращений к серверу. Я думаю, что некоторые из $ Operators могут быть тем, что мне нужно здесь, но просто нужно подумать о том, как лучше всего подойти к этому.

Суть того, что я здесь делаю, - это сохранение накопленного исторического документа записей snrs с текущим текущим значением, а также сохранение любых исторических записей в массиве, даже если они больше не "живы", сообщаются и т.д. Это позволяет в будущем сообщать о вещах, которые больше не существуют в настоящее время, но были в некоторый момент в прошлом. Значения _id генерируются приложением, глобально уникальны для всех документов и никогда не изменяются после первоначального создания. Например, на прошлой неделе сообщалось о «скорости ветра», а на этой неделе - нет. Однако значение _id не изменится, если «Скорость ветра» снова начнет сообщать. Следуйте

При необходимости могут быть предоставлены разъяснения или более подробная информация.

Спасибо.

1 Ответ

2 голосов
/ 07 марта 2012

Путем изменения структуры вашего документа со встроенных массивов на вложенные документы с ключом _ids вы можете сделать это.например, {"MAC": "00: 00: 00: 00: 00: 01", "_id": 1, "dt": ISODate ("2012-02-24T18: 59: 02Z"), "GID": 237, "hw": {"1": {"snrs": {"1": "Скорость ветра", "2": "Порыв ветра"}, "tag": "Датчики погоды"}}, "mId":341457, "name": "ПОГОДА 1"}

Я создал вышеупомянутый документ с помощью следующего upsert

db.foo.update(
{_id:1},
{
    $set: {
        "gId" : 237,
        "name" : "WEATHER STATION 1",
        "mId" : 341457,
        "MAC" : "00:00:00:00:00:01",
        "dt" : new Date("Fri, 24 Feb 2012 13:59:02 GMT -05:00"),
        "hw.1.tag" : "Weather Sensors",
        "hw.1.snrs.1" : "Wind Speed",
        "hw.1.snrs.2" : "Wind Gust"
    }
},
true
)

Теперь, когда я запускаю

db.foo.update(
{_id:1},
{
    $set: {
        "dt" : new Date(),
        "hw.2.snrs.1" : "Rainfall Amount"
    }
},
true
)

Iполучить

{
    "MAC" : "00:00:00:00:00:01",
    "_id" : 1,
    "dt" : ISODate("2012-03-07T05:14:31.881Z"),
    "gId" : 237,
    "hw" : {
            "1" : {
                    "snrs" : {
                            "1" : "Wind Speed",
                            "2" : "Wind Gust"
                    },
                    "tag" : "Weather Sensors"
            },
            "2" : {
                    "snrs" : {
                            "1" : "Rainfall Amount"
                    }
            }
    },
    "mId" : 341457,
    "name" : "WEATHER STATION 1"
}
...