如何访问聚合框架中数组内部对象内的字段?

时间:2018-01-16 17:27:11

标签: mongodb

假设我将此数据结构作为我的文档:

{
  id: 1,
  customers: [
    {
      id: 2,
      addresses: [
        {
          phone: "555-342",
          zipCode: "1946873193",
          addressLine: "whatever"
        }
      ]
    }
  ]
}

如何访问聚合框架中的phone属性? $ROOT.customers.0.addresses.0.phone不能用作字段路径表达式。

2 个答案:

答案 0 :(得分:2)

您可以使用$let$arrayElemAt来处理两个嵌套级别,但是您可以添加$ project来获取phone属性。

db.collection.aggregate([
{
  $addFields: {
    selectedElement: {
        $let: {
           vars: {
              fstCustomer: { $arrayElemAt: [ '$customers', 0 ] }                
           },
           in: { $arrayElemAt: [ '$$fstCustomer.addresses', 0 ] }
        }
     }
  } 
},
{
  $project: {
    phone: "$selectedElement.phone"
  }
}
])

答案 1 :(得分:2)

您可以通过以下方式链接$arrayElemAt

外部$let表达式,以获取第一个客户和内部$let表达式,以获取第一个客户的第一个地址元素,然后投射电话属性。

db.col.aggregate(
{"$project":{
  "phone":{
    "$let":{
      "vars":{
        "customer":{"$arrayElemAt":["$customers",0]}
      },
      "in":{
        "$let":{
          "vars":{
            "address":{"$arrayElemAt":["$$customer.addresses",0]}
          },
          "in":"$$address.phone"
        }
      }
    }
  }
}})