假设我将此数据结构作为我的文档:
{
id: 1,
customers: [
{
id: 2,
addresses: [
{
phone: "555-342",
zipCode: "1946873193",
addressLine: "whatever"
}
]
}
]
}
如何访问聚合框架中的phone
属性?
$ROOT.customers.0.addresses.0.phone
不能用作字段路径表达式。
答案 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"
}
}
}
}
}})