Как обновить запись в mongodb учитывая уникальный параметр?

Всем привет. Есть запись в mongodb

{
    "_id" : ObjectId("599aa4467745ffb9644da8eb"),
    "email" : "mail@mail.ru",
    "series" : [ 
        {
            "id" : "58e52c4e89673a7a83438f1c",
            "letters" : [ 
                {
                    "id" : "1bki584500r0trtyie7700001",
                    "sented_at" : [ 
                        "2017-08-23 16:45"
                    ]
                }
            ]
        }
    ]
}


Мне нужно обновить запись, вставив массив в series при условии что серия с id 58e52c4e89673a7a83438f1c уже существует, если же не существует, то добавить.

"series" : [ 
        {
            "id" : "58e52c4e89673a7a83438f1c",
            "letters" : [ 
                {
                    "id" : "1bki584500r0trtyie7700001",
                    "sented_at" : [ 
                        "2017-08-23 16:45"
                    ]
                },
                {
                    "id" : "1bki584500r0trtyie7700222",
                    "sented_at" : [ 
                        "2017-08-23 18:22"
                    ]
                }
            ]
        }
    ]


Делаю так

$update = [
      "id" => "58e52c4e89673a7a83438f1c",
             "letters" => [
                   [
                        "id" => "1bki584500r0trtyie77000022",
                         "sented_at" => [ 
                               "2017-08-23 16:45"
                          ]
                   ]
            ]
   ];

$contacts->where(['email' => 'mail@mail.ru'])->push(["series" => $update]);


Обновляется не так как надо. Получается что серия с "id" => "58e52c4e89673a7a83438f1c" дублируется, а нужно прописать в него либо добавить если его не существует
  • Вопрос задан
  • 449 просмотров
Решения вопроса 1
zoonman
@zoonman
⋆⋆⋆⋆⋆
Вам нужно делать update с $addToSet.

db.getCollection('t1').update(
{
    _id: ObjectId("599aa4467745ffb9644da8eb"),
    "series.id": "58e52c4e89673a7a83438f1c",
},
    
{ $addToSet: {
        'series.$.letters': {
            "id" : "1bki584500r0trtyie7700002",
                    "sented_at" : [ 
                        "2017-08-23 16:46"
                    ]
        } 
    }
}
)


И вместо 'sented_at' использовать 'sent_at'.
Прошедшая форма глагола send это sent.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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