Я работаю с набором данных, который является каталогом продукции. Там всего около 20к предметов, и изменение цены происходит редко. Может быть, 100 обновлений в месяц, максимум.
Однако в этом случае интересным является изменение цены, и я хочу отслеживать цены в течение длительных периодов времени.
Я пытаюсь найти лучший способ хранения ценовых данных таким образом, чтобы упростить запрос.
В настоящее время он хранится в массиве в документе продукта. Просто цена вместе с отметкой времени. Учитывая небольшой и довольно статичный набор данных, как бы вы разработали модель?
Кроме того, бонусный вопрос, как бы выглядел фильтр, который мог бы дать список продуктов, где текущая цена ниже предыдущей?
Пример данных, упрощенная версия модели:
// Match, current price is lower than previous price
db.TestC.insert({Name: "P1", CurrentPrice: 10.0, PriceHistory: [{Price: 14.0, Timestamp: ISODate("2019-04-26T07:11:11.939Z")}, {Price: 12.0, Timestamp: ISODate("2019-04-27T07:11:11.939Z")}]})
// No match, price history doesn't exist yet
db.TestC.insert({Name: "P2", CurrentPrice: 10.0, PriceHistory: null})
// No match, previous price was lower than current price
db.TestC.insert({Name: "P3", CurrentPrice: 18.0, PriceHistory: [{Price: 14.0, Timestamp: ISODate("2019-04-26T07:11:11.939Z")}, {Price: 12.0, Timestamp: ISODate("2019-04-27T07:11:11.939Z")}]})
Отредактируйте после дополнительной работы над этим:
Итак, я наконец-то придумал именно то, что мне было нужно, и подумал, что должен поделиться, если кому-то это поможет:
db.TestCollection.aggregate({
'$project': {
'Number': 1,
'AssortmentKey': 1,
'AssortmentName': 1,
'NameExtension': 1,
'Name': 1,
'CurrentPrice': {
'$arrayElemAt': [
'$PriceHistory', -1
]
},
'PreviousPrice': {
'$arrayElemAt': [
'$PriceHistory', -2
]
}
}
}, {
'$match': {
'$expr': {
'$lt': [
'$CurrentPrice.Price', '$PreviousPrice.Price'
]
}
}
})