@Scorpiored88

Как в MongoDB сделать push в масив если запись существует, а если нет создать новую?

Всем доброго!
Есть ли возможность в MongoDB одним запросом в базу обновить document, в смисле добавления данных в масив, если по данным поиска такой document существует, в противном случае создать новый document?
Тоесть, есть у меня document

{
    _id: ObjectId('637d112b010b5c09f43f0fdf'),
    someAdditionalID: 12345,
    userName: 'username1',
    userDataArray: [
        {
            name: 'name',
            description: 'тест1'
        }
    ]
}


Соответственно, я ищу запись по {"userName": "username1", "someAdditionalID" : 12345}
и нужно если такая запись/document существует сделать push в userDataArray,
с данными
{ name: 'name2', description: 'тест2'}
чтобы обновленный document изменился на:
{
    _id: ObjectId('637d112b010b5c09f43f0fdf'),
    someAdditionalID: 12345,
    userName: 'username1',
    userDataArray: [
        {
            name: 'name',
            description: 'тест1'
        },
        {
            name: 'name2',
            description: 'тест2'
        }
    ]
}


Но в случие когда поиск записи/document по заданным параметрам не дал результата (тоесть такой записи/document не существует), создать новую запись/document
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 1
boratsagdiev
@boratsagdiev
Нужно смотреть на опцию upsert. Вот рабочий пример для задачи выше:

db.users.updateOne(
  {
    userName: "username1",
    someAdditionalID: 12345,
  },
  {
    $push: {
      userDataArray: {
        name: "updated name",
        description: "updated desc",
      },
    },
    $setOnInsert: {
      userName: "new username",
      someAdditionalId: 478326,
    },
  },
  {
    upsert: true,
  }
);


В случае если по запросу ничего не найдено, то создастся новый документ, это регулируется опцией upsert: true. Если документ найден, то в массив запушится новый объект.

Поля для нового документа можно задать в $setOnInsert.

Достичь такого результата можно разными методами, вот например ещё варианты: https://www.baeldung.com/mongodb-upsert
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы