ms-dred
@ms-dred
Вечно что то не то и что то не так...

Как обновить значения в массиве объектов?

Требуется обновить значения некоторых элементов в массиве объектом
К пример есть документ
{
    "url": "link",
    "comments": [{
        "user": "user1",
        "field": 1
    },{
        "user": "user1",
        "field": 1
    },{
        "user": "user2",
        "field": 1
    },{
        "user": "user3",
        "field": 1
    }]
}


Нужно у comments.user === user1 изменить значение comments.field

Сейчас чтобы это провернуть, занимаюсь "извращением", получаю все комментарии, затем в цикле при условии делаю обновление нужного элемента объекта. Т.е. при 1000 комментариев надо 1000 раз проверить, и возможно из них 100 раз выполнить запрос на обновление.

Можно ли сейчас как то это сделать по проще?
  • Вопрос задан
  • 753 просмотра
Пригласить эксперта
Ответы на вопрос 1
@lega
По сути пол field это чекалка отправки уведомлений, т.е. 0 не отправлять ответ пользователю, 1 отправлять.

Если вам нужно включать/отключать значение по всем комментам в пределах пользователя, то зачем это значение хранить в каждом коменте.
Для обновления по ключу используйте словарь вместо массива.
Пример:
{
  comments: [],
  flags: {
    user1: true,
    user2: false
  }
}
С такой структурой, вы можете включить/выключить флаг по пользователю по всем комментам (всему документу), а если нужна возможность переключать конкрентные комменты, то можно рядом хранить в разрезе пользователь-коммент ( flagsByComments:{ user2: {comment1: true, comment2: false} }).

Про сложность обновления, если у вас на 1000 чтений 1 запись, то не страшно, что обновление сложное, главное чтобы чтения были быстрые.

Т.е. при 1000 комментариев надо 1000 раз проверить, и возможно из них 100 раз выполнить запрос на обновление.

С локом достаточно будет одного обновления (ну и +1 обновление для лока, хотя не обязательно, зависит от типа лока)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы