Сложный запрос для mongodb

215
01 января 2019, 12:40

Есть коллекция, содержащие документы по типу:

{
 key: String,
 array_values: [
     {value: String, counter: Number}
 ]
}

Необходимо вставить пару ключ-значение, так, чтобы:

  1. В случае есть нет ключа, то добавился новый документ;
  2. В случае, если есть ключ, то, в случае, если есть значение в массиве, увеличилось значение поля counter, если нет такого значения, то просто добавилось в массив.

К примеру есть документ:

{
 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?

Или надо все делать отдельными запросами на обновление?

READ ALSO
Пара вопросов о слайдере

Пара вопросов о слайдере

Помогите решить 2 проблемы:

169
Некорректные пропорции фигур в CreateJS

Некорректные пропорции фигур в CreateJS

Есть проблема с пропорциями фигур при их создании посредством CreateJSНиже приведён JS-код:

179