过滤 MongoDB 中的子文档

Filtering subdocuments in MongoDB

我有这样一个文档:

{"_id" : ObjectId("5836b91788538303"),
 "Name" : "Maria",
 "Email" : "mgarciasanz@gmail.es",
 "Age" : 34,
 "Contacts": [
      {"Contact_user" : {
               "_id" : ObjectId("5836b916885383"),
               "Name" : "Alejandro",
               "Email" : "aamericagarzon@hotmail.es",
               "Age" : 32}},

      {"Contact_user" : {
               "_id" : ObjectId("5836b916888956"),
               "Name" : "Victor",
               "Email" : "ctiernocrespo@hotmail.es",
               "Age" : 41}},

       {"Contact_user" : {
               "_id" : ObjectId("5836b9168880987"),
               "Name" : "Agata",
               "Email" : "adelgadosanchez@hotmail.es",
               "Age" : 37}},
         ...

      ]}

我需要做的第一件事是将 "Email" 与 "mgarciasanz@gmail.es" 匹配,第二步是过滤子文档以获得年龄大于或等于 36 的联系人岁。我试过放松、双重匹配条件、过滤器...但我没有进入解决方案。

此外,我需要这样的输出:

{"Email" : "mgarciasanz@gmail.es", "Contact_email" : "vtiernocrespo@hotmail.es", "Contact_age" : 41}
{"Email" : "mgarciasanz@gmail.es", "Contact_email" : "adelgadosanchez@hotmail.es", "Contact_age" : 37}
{"Email" : "mgarciasanz@gmail.es", "Contact_email" : "tjazmintablas@hotmail.es", "Contact_age" : 36}

如何管理才能在每个输出句子中重复 "Email"

提前致谢

您可以尝试查询,

  • $match您需要的条件
  • $unwind解构Contacts数组
  • $match您需要的条件
  • $project 显示必填字段
db.collection.aggregate([
  {
    $match: {
      Email: "mgarciasanz@gmail.es"
    }
  },
  { $unwind: "$Contacts" },
  {
    $match: {
      "Contacts.Contact_user.Age": {
        $gte: 36
      }
    }
  },
  {
    $project: {
      _id: 0,
      Email: 1,
      Contact_email: "$Contacts.Contact_user.Email",
      Contact_age: "$Contacts.Contact_user.Age"
    }
  }
])

Playground