Как отправить документ в набор документов MongoDB, который уникален одним полем? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть следующий документ в mongodb:

db.reports.insert({
    selection_type: "views",
    selection_value: "desktop",
    chart_points: [
        {
            date: "2018-01-01",
            value: 1831
        },
        {
            date: "2018-01-02",
            value: 0
        }
    ]
})

И я хочу вставить или обновить элемент из chart_points на основе date.Я пытаюсь использовать $addToSet, но это создаст новый элемент в массиве.

Ожидаемый результат:

{
    date: "2018-01-02",
    value: 2053
}

Результат после использования $addToSet:

{
    date: "2018-01-02",
    value: 0
},
{
    date: "2018-01-02",
    value: 2053
}

Я получаю этот результат после выполнения запроса:

db.reports.update(
    {},
    {
        $addToSet: {
            chart_points: {
                date: "2018-01-03",
                value: 1876
            }
        }
    }
)

ПРИМЕЧАНИЕ. У меня в коллекции только этот документ.

1 Ответ

0 голосов
/ 18 сентября 2018

Вам понадобятся два утверждения.Вы можете использовать позиционный оператор в $set для обновления, когда дата существует.

db.reports.update(
    { "chart_points.date": "2018-01-02" }, 
    { 
        $set: {
            "chart_points.$.value": 2053
        }
    }
)  

Добавление проверки $ne в документ запроса не позволит $addToSetвставка, когда дата уже существует.

db.reports.update( 
    { "chart_points.date": { $ne: "2018-01-02"}}, 
    { 
        $addToSet: {
            chart_points: {
                date: "2018-01-02",
                value: 2053
            }
        }
    }
);

Вы можете запустить их вплотную, чтобы получить необходимую функцию вставки / обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...