MongoDB $ addToSet внутри другого $ addToSet - PullRequest
1 голос
/ 01 мая 2020

Я пытаюсь получить ответ ниже на запрос.

{
  users:[
    user:{
       name:"",
       email:[ 
       ]
    },
    ....user2
  ]
}

У меня есть что-то похожее на ниже.

Я скажу так. У одного пользователя может быть n устройств. Он может иметь более одного электронного письма на устройство. Я хочу группировать на устройствах. И пользовательское поле должно иметь общую информацию для этого устройства. Как мы думаем, имя всегда будет одинаковым. Атрибуты спецификаций c устройства также необходимы, например whatKindOfDevice, howManyIssuesAreThereInThatDevice, howManyCanBeAddressedByUpgrade, howManyAreRare, et c .. наряду с этим мне нужно получить все электронные письма, используемые в этом устройстве, такие как владелец, пользователь, ассоциативная связь - все электронные письма помещены.

Думаю, мой идентификатор документа не связан с одним пользователем, одним устройством. Один пользователь может иметь любое количество устройств. Одно устройство может иметь n Количество документов.

$group:{
   "_id":"user_device_id",
   "user": {
    "$addToSet": {
      "name":"$name",
      "deviceName":"$deviceName",
      "email": {"$addToSet":{}} //Something Similar I am expecting
    }
   }
}

Если я добавлю внешнего пользователя электронной почты, он будет работать - но это повлияет на требуемый формат ответа.

Возможно ли или каким-либо другим способом получить аналогичный ответ через запрос?

Предположим, у одного пользователя может быть несколько документов. В каждом do c могут быть одинаковые или повторяющиеся идентификаторы электронной почты. Я пытаюсь собрать это вместе.

Пожалуйста, сообщите.

Пример Do c:

{
  _id:ObjectId,
  name:"user1",
  email:"a@yahoo.com"
},
{
  _id:ObjectId,
  name:"user1",
  email:"a@device.com"
},
..user2Doc
..user1Doc with another category, duplicate email i.e a@yahoo.com
..user2Doc with new email
..

1 Ответ

1 голос
/ 01 мая 2020

Ну, кажется, что вы хотите получить все email для конкретного user, а затем group все users.

Итак, чтобы добиться этого, вы должны делать последовательно этапы группировки.

Я использовал следующие документы:

[
{
  name:"user1",
  email:"a@yahoo.com"
},
{
  name:"user1",
  email:"a@device.com"
},
{
  name:"user2",
  email:"b@yahoo.com"
},
{
  name:"user1",
  email:"c@device.com"
}
]

Вот запрос:

db.collection.aggregate([
  {
    $group:{
      "_id":"$name",
      "emails":{
        $addToSet:"$email"
      },
      "name":{
        $first:"$name"
      }
    }
  },
  {
    $group:{
      "_id":null,
      "users":{
        $addToSet:{
          "name":"$name",
          "email":"$emails"
        }
      }
    }
  },
  {
    $project:{
      "_id":0
    }
  }
]).pretty()

Вывод :

{
        "users" : [
                {
                        "name" : "user1",
                        "email" : [
                                "c@device.com",
                                "a@device.com",
                                "a@yahoo.com"
                        ]
                },
                {
                        "name" : "user2",
                        "email" : [
                                "b@yahoo.com"
                        ]
                }
        ]
}

Для получения информации о $group см. здесь .

Надеюсь, это поможет:)

...