Как добавить точку (.) внутри имени поля? - PullRequest
0 голосов
/ 15 февраля 2020

Когда я запускаю эту команду:

db.runCommand( 

  {
    aggregate:"myColl",
    pipeline:[
      {
        $group:{
          _id:{os_name:"$os_name",os_version:"$os_version"},
          "events.login":{$sum:"$events.login"},
          count:{$sum:NumberInt(1)}}
      }
    ],
    cursor:{}
  }

 )

Я получаю сообщение об ошибке:

Имя поля 'events.login' не может содержать '.'

Как я могу сделать, чтобы сохранить '.' в возвращенном имени поля (ie: events.login)

1 Ответ

1 голос
/ 15 февраля 2020

Не совсем ясно, что вы пытаетесь сделать, поэтому посмотрите на это:

Ошибка:

Имя поля '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

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