mongodb - 当父元素在每条记录中具有不同名称时,选择 mongodb 集合中的子元素

标签 mongodb mongodb-query aggregation-framework

我的 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" ] }
                            }
                        }
                    }
                }
            }
        }
    }
])

Mongo Playground

关于mongodb - 当父元素在每条记录中具有不同名称时,选择 mongodb 集合中的子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59115127/

相关文章:

mongodb - 在 MongoDB 中执行 GROUP BY 之前进行排序

mongodb - Centos 6 下 Mongo 的读取性能缓慢

node.js - Nodejs如何让for循环等待直到运行下一个循环实例

MongoDB mongorestore 和现有的记录集合

javascript - 根据字段数组大小分组并删除文档

mongodb - 如何在 MongoDB 聚合中展开多个数组

java.lang.IllegalArgumentException : Invalid reference performing aggregation in MongoDB 异常

mongodb - Mongo 为两个或多个字段的条目查找重复项

mongodb - 使用 MongoDB 投影数组

node.js - 如何查询电子邮件与 example@gmail.com 匹配的嵌套文档的嵌套文档