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用户提前一分钟回答,所以我应该接受他的答案,尽管答案很相似