MongoDB 仅从数组中的对象中获取选定的元素

MongoDB get only selected elements from objects inside an array

我拥有的是 MongoDB 中的文档集合,其结构类似于

[
  {
    "userid": "user1",
    "addresses": [
      {
        "type": "abc",
        "street": "xyz"
      },
      {
        "type": "def",
        "street": "www"
      },
      {
        "type": "hhh",
        "street": "mmm"
      },
      
    ]
  },
  {
    "userid": "user2",
    "addresses": [
      {
        "type": "abc",
        "street": "ccc"
      },
      {
        "type": "def",
        "street": "zzz"
      },
      {
        "type": "hhh",
        "street": "yyy"
      },
      
    ]
  }
]

如果我可以给出“type”和“userid”,我怎样才能得到结果

[
  {
    "userid": "user2",
    "type": "abc",
    "street": "ccc",   
  }
]

即使结果只得到“街道”也很好。唯一的限制是我需要在根元素本身而不是数组中获取它

您应该可以使用 unwindmatchproject,如下所示:

db.collection.aggregate([
{
  "$unwind": "$addresses"
},
{
  "$match": {
    "addresses.type": "abc",
    "userid": "user1"
  }
},
{
  "$project": {
    "_id": 0,
    "street": "$addresses.street"
  }
}
])

您也可以复制 match 步骤作为将文档数量减少到 unwind 的第一步。

这里是游乐场link

有类似的question/answer.

像这样:

db.collection.aggregate([
{
 $match: {
   userid: "user1" , "address.type":"abc"
}
},
{
$project: {
  userid: 1,
  address: {
    $filter: {
      input: "$addresses",
      as: "a",
      cond: {
        $eq: [
          "$$a.type",
          "abc"
        ]
      }
    }
  }
}
},
{
  $unwind: "$address"
},
{
$project: {
  userid: 1,
  street: "$address.street",
  _id: 0
  }
}
])

解释:

  1. 仅过滤具有您需要的用户 ID 和 addresess.type 的文档
  2. Project/Filter 仅处理具有所需类型的元素
  3. 展开地址数组
  4. 仅根据要求投影所需的元素

为获得最佳结果,请在 { userid:1 } 字段上创建索引或在 { userid:1 , address.type:1 } 字段上创建复合索引

playground