Я пытаюсь иметь дело с временными рядами с использованием MongoDB. Общим решением, принятым сообществом, является использование поддокументов для хранения информации на разных уровнях детализации (см. Schema Design for Time Series Data in MongoDB).Обновление коллекции MongoDB: инициализировать документ со значениями по умолчанию
Например, посмотрите на следующий документ:
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”,
values: [
999999, // 1 second
…
1000000, // nth second
1500000, // n+1th second
…
2000000 // 60th
]
}
Документ индексируется минуты информации и содержит поддокумент, которые хранят более подробную информацию на каждую секунду.
Пока все хорошо. Такой подход требует оптимизации для правильной работы:
Another optimization [..] is preallocating all documents for the upcoming time period; This never causes an existing document to grow or be moved on disk.
Для реализации вышеописанной оптимизации можно использовать $setOnInsert
свойства по методу update
.
db.getCollection('aCollection').update(
{
timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
type: “memory_used”
},
{
$setOnInsert: { values: {'0': 0, '1': 0, '2': 0}},
$inc: {"values.30": 1}
},
{ upsert: true }
)
Проблема в том, что невозможно использовать одно и то же поле в одном и том же обновлении в двух разных режимах. Выше обновление istruction генерирует следующее сообщение об ошибке:
Cannot update 'values' and 'values.30' at the same time
Эта проблема отслеживается на этом issue.
Мой вопрос: есть ли временное решение? I префикс, что я не могу использовать любую партию, которая предварительно выделяет пустые документы, потому что я не могу знать значение проиндексированных полого априори (в приведенном выше примере, значение поля type
.
Благодарности заранее.
Зачем нужна вставка? У вас есть уникальный индекс по типу и метке времени? –
Вы правы, мне не хватает вставить эту точку. '_id' должен быть получен из других полей в документе, например, присоединяя их к символу' -'. –