当父项在每条记录中具有不同的名称时,在mongodb集合中选择子元素
我的mongodb集合有以下json格式,其中我需要选择子元素来执行计算,但父元素在每个记录中都有不同的名称 distribution是每个记录中的父元素,5d39e82f9ab1和5d09f133是可变子元素 我想选择并执行以下操作: 以下是可能的查询:当父项在每条记录中具有不同的名称时,在mongodb集合中选择子元素,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我的mongodb集合有以下json格式,其中我需要选择子元素来执行计算,但父元素在每个记录中都有不同的名称 distribution是每个记录中的父元素,5d39e82f9ab1和5d09f133是可变子元素 我想选择并执行以下操作: 以下是可能的查询: "$project" : { "distribution.*.onBoardAgent" : 1, Difference: { $subtract: [ "$distributi
"$project" : {
"distribution.*.onBoardAgent" : 1,
Difference: { $subtract: [ "$distribution.*.onBoardAgent.debit", $distribution.*.onBoardAgent.debit" ] }
}
},
这里,“*”是我的每个集合中的变量名 MongoDB中没有“*”
语法。要动态遍历BSON文档,需要使用and运算符。第一个运算符返回键值对的数组,因此您必须使用它来变换嵌套对象
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" ] }
}
}
}
}
}
}
}
])
使用聚合运算符将动态字段转换为键值对
db.collection.aggregate([
{ "$project": {
"distribution": {
"$objectToArray": "$distribution"
}
}},
{ "$unwind": "$distribution" }
])
现在,您将通过使用v
{
"$project": {
"distribution.v.onBoardAgent": 1,
"Difference": {
"$subtract": [
"$distribution.v.onBoardAgent.debit",
"$distribution.v.onBoardAgent.debit"
]
}
}
}
如果我必须为代理绘制地图,system and merchant然后在$map语法中,我需要为每个字段分配不同的变量,如k和v或整个转换?或者,如果您想动态地这样做,您可以运行另一个嵌套的$objectToArray。如果我添加多个字段,这将使查询变得相当大。@Rahuland这是真的-如果可能,否则您需要处理大型查询获取objectToArray部分,但$subtract抛出错误:“errmsg”:“cant$subtract aarray from数组”@rahuland?{“$project”:{“Difference”:{“$subtract”:[“$distribution.v.onBoardAgent.debit”,“$distribution.v.onBoardAgent.credit”]}}}@Ashh在这部分
{
"$project": {
"distribution.v.onBoardAgent": 1,
"Difference": {
"$subtract": [
"$distribution.v.onBoardAgent.debit",
"$distribution.v.onBoardAgent.debit"
]
}
}
}