我的 mongodb 集合有以下 json 格式,其中我需要选择子元素来执行计算,但父元素每条记录中都有不同的名称。
distribution is the parent element and 5d39e82f9ab1 and 5d09f133 are the variable child elements in each record.
{"distribution" : {
"5d39e82f9ab1" : {
"id" : "5cfa18a",
"name" : "Test1",
"feeTarget" : "5d39e82",
"onBoardAgent" : {
"debit" : 0,
"credit" : 0
},
"transAgent" : {
"debit" : 0,
"credit" : 0
},
"redeemAgent" : {
"debit" : 0,
"credit" : 0
},
"merchant" : {
"debit" : 0,
"credit" : 0
},
"system" : {
"debit" : 0,
"credit" : 0
},
"aggregator" : {
"debit" : 0,
"credit" : 0
},
"distributor" : {
"debit" : 0,
"credit" : 0
}
}
}
}
{"distribution" : {
"5d09f133" : {
"id" : "5d09f133",
"name" : "test2",
"feeTarget" : "5d09f133",
"onBoardAgent" : {
"debit" : 0,
"credit" : 0
},
"transAgent" : {
"debit" : 0,
"credit" : 28
},
"redeemAgent" : {
"debit" : 0,
"credit" : 0
},
"merchant" : {
"debit" : 0,
"credit" : 0
},
"system" : {
"debit" : 0,
"credit" : 7
},
"aggregator" : {
"debit" : 0,
"credit" : 0
},
"distributor" : {
"debit" : 0,
"credit" : 0
}
}
}
}
我想选择并执行如下操作:
以下是可能的查询:
"$project" : {
"distribution.*.onBoardAgent" : 1,
Difference: { $subtract: [ "$distribution.*.onBoardAgent.debit", $distribution.*.onBoardAgent.debit" ] }
}
},
这里“*”是我每个集合中的变量名称。
最佳答案
MongoDB 中没有 "*"
语法。要动态遍历 BSON 文档,您需要使用 $objectToArray和 $arrayToObject运营商。第一个运算符返回一个键值
对数组,因此您必须使用 $map转换您的嵌套对象
db.collection.aggregate([
{
$addFields: {
distribution: {
$arrayToObject: {
$map: {
input: { $objectToArray: "$distribution" },
as: "dist",
in: {
k: "$$dist.k",
v: {
onBoardAgent: "$$dist.v.onBoardAgent",
difference: { $subtract: [ "$$dist.v.onBoardAgent.debit", "$$dist.v.onBoardAgent.credit" ] }
}
}
}
}
}
}
}
])
关于mongodb - 当父元素在每条记录中具有不同名称时,选择 mongodb 集合中的子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115127/