Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何在聚合框架中访问数组内的字段和数组内的对象?_Mongodb - Fatal编程技术网

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

Mongodb 如何在聚合框架中访问数组内的字段和数组内的对象?,mongodb,Mongodb,假设我将此数据结构作为我的文档: { id: 1, customers: [ { id: 2, addresses: [ { phone: "555-342", zipCode: "1946873193", addressLine: "whatever" } ] } ] } 如何访问聚合框架中的phone属性? $ROOT.customer

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

{
  id: 1,
  customers: [
    {
      id: 2,
      addresses: [
        {
          phone: "555-342",
          zipCode: "1946873193",
          addressLine: "whatever"
        }
      ]
    }
  ]
}
如何访问聚合框架中的
phone
属性?
$ROOT.customers.0.addresses.0.phone
不能用作字段路径表达式。

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

db.collection.aggregate([
{
  $addFields: {
    selectedElement: {
        $let: {
           vars: {
              fstCustomer: { $arrayElemAt: [ '$customers', 0 ] }                
           },
           in: { $arrayElemAt: [ '$$fstCustomer.addresses', 0 ] }
        }
     }
  } 
},
{
  $project: {
    phone: "$selectedElement.phone"
  }
}
])
db.col.aggregate(
{"$project":{
  "phone":{
    "$let":{
      "vars":{
        "customer":{"$arrayElemAt":["$customers",0]}
      },
      "in":{
        "$let":{
          "vars":{
            "address":{"$arrayElemAt":["$$customer.addresses",0]}
          },
          "in":"$$address.phone"
        }
      }
    }
  }
}})
您可以使用with处理两个嵌套级别,但随后可以添加$project以获取
phone
属性

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

您可以按以下方式链接
$arrayElemAt

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

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

您可以按以下方式链接
$arrayElemAt

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

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

@AlexBlex是的,我看到了,但不明白如何使用链式“arrayElemAt”来解释原因语法是
{$arrayElemAt:[“$customers”,0]}
,而不是
customers.0
。适用于所有数组。@AlexBlex是的,我看到了,但不明白如何使用链式“arrayElemAt”作为原因语法是
{$arrayElemAt:[“$customers”,0]}
,而不是
customers.0
。适用于所有数组。我发现,
$let
是缺少的键@mickl用户提前了一分钟回答,所以我应该接受他的答案,尽管答案很相似。我看,
$let
是丢失的钥匙@mickl用户提前一分钟回答,所以我应该接受他的答案,尽管答案很相似