Не совсем ясно, что вы пытаетесь сделать, поэтому посмотрите на это:
Ошибка:
Имя поля 'events.login «не может содержать». '
Это потому, что, как на этапе $group
, когда он создает новое поле в каждом документе для данного имени, вы не сможете создать его следующим образом: "events.login"
означает, что не может создать подзадачу c это должен быть объект в поле верхнего уровня events
в принципе вы не можете использовать нотацию .
, поэтому, чтобы она работала, вам нужно иметь еще один этап, подобный этому :
db.collection.aggregate([{
$group: {
_id: { os_name: "$os_name", os_version: "$os_version" },
"events": { $sum: "$events.login" },
count: { $sum: NumberInt(1) }
}
}, { $addFields: { 'events.login': '$events' } }])
Тест: MongoDB-Playground
Если вам нужно обновить login
поле внутри events
поля & чтобы сохранить все остальные поля внутри events
, попробуйте выполнить запрос ниже, который получит последний документ в итерации каждого _id
(это будет последний документ, вставленный в БД по этим _id
критериям) и добавьте login
к нему:
db.collection.aggregate([{
$group: {
_id: { os_name: "$os_name", os_version: "$os_version" },
"login": { $sum: "$events.login" }, 'events': { $last: '$events' },
count: { $sum: NumberInt(1) }
}
}, { $addFields: { 'events.login': '$login' } }, { $project: { login: 0 } }])
Тест: MongoDB-Playground