【问题标题】:MongoDB $addToSet inside another $addToSetMongoDB $addToSet 在另一个 $addToSet 中
【发布时间】:2020-08-16 03:21:45
【问题描述】:

我正在尝试从查询中获得以下响应。

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

我有类似下面的东西。

我会这样说。一个用户可以拥有 n 台设备。他的每台设备可能有不止一封电子邮件。我想在设备上分组。并且用户字段应该具有该设备的通用信息。正如我们所想,名称将始终相同。还需要设备特定属性,例如 whatKindOfDevice、howManyIssuesAreThereInThatDevice、howManyCanBeAddressedByUpgrade、howManyAreRare 等。除此之外,我还需要获取该设备中使用的所有电子邮件,例如所有者、用户、关联 - 所有电子邮件。

认为我的文档 ID 与单个用户、单个设备无关。一个用户可以拥有任意数量的设备。一台设备可以有 n 个文档。

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

如果我添加电子邮件外部用户,它可以工作 - 但它会影响所需的响应格式。

是否有可能或任何其他方式通过查询获得类似的响应?

假设一个用户可以拥有多个文档。在每个文档中,可能有相同或重复的电子邮件 ID。我正在努力解决这个问题。

请指教。

示例文档:

{
  _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
..

【问题讨论】:

  • 请分享示例文档。
  • @VijayRajpurohit 检查编辑。我试图模仿我的场景
  • 请分享完整的文档和正确的所需输出。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

好吧,您似乎想要获取特定 user 的所有 email,然后获取所有 usersgroup

因此,要实现这一点,您必须进行连续的分组阶段。

我使用了以下文件:

[
{
  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的更多信息请参考here

希望这会有所帮助:)

【讨论】:

  • 糟糕。请看我的编辑。我需要 addToSet 不仅用于电子邮件
  • addToSet 仅适用于电子邮件 - 适用于您的解决方案。我还有其他应该属于同一个 json 对象的东西。但是电子邮件应该是一个数组。我会尝试添加更多细节
  • 请看我的编辑。希望我分享了足够的信息。
  • @Gibbs,请在输出中添加您需要的确切字段。
猜你喜欢
  • 2015-03-23
  • 2013-08-26
  • 1970-01-01
  • 2015-04-29
  • 2013-08-23
  • 2017-05-30
  • 2022-11-29
  • 2020-03-16
  • 1970-01-01
相关资源
最近更新 更多