Есть коллекция, содержащие документы по типу:
{
key: String,
array_values: [
{value: String, counter: Number}
]
}
Необходимо вставить пару ключ-значение, так, чтобы:
К примеру есть документ:
{
key: "key",
array_values: [{value: "value", counter: 1}]
}
При вставке {key: "key", value: "value"}
, должно получиться:
{
key: "key",
array_values: [{value: "value", counter: 2}]
}
При вставке {key: "key1", value: "value"}
, должен добавиться документ:
{
key: "key1",
array_values: [{value: "value", counter: 1}]
}
При вставке {key: "key", value: "value1"}
, должно получиться:
{
key: "key",
array_values: [{value: "value", counter: 1}, {value: "value1", counter: 1}]
}
UPD: Я пытался делать так:
MyModel.statics.addKeyValue = async function (key, value) {
let item = await this.findOne({key: key}).exec();
if (item) {
const arr = item.array_values;
let findItem = arr.find((arrItem) => {
return arrItem.value === value;
});
if (findItem !== undefined) {
findItem.count += 1;
} else {
item.array_values.push({value: value, counter: 1});
}
await item.save();
} else {
await this.create({
key : key,
array_values: [{value: value, counter: 1}]
});
}
};
Это в целом работает, но очень медленно. 170 тысяч записей вставляется порядка 10 часов.
Есть ли способ сделать это одним запросом в findOneAndUpdate?
Или надо все делать отдельными запросами на обновление?
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть проблема с пропорциями фигур при их создании посредством CreateJSНиже приведён JS-код: