Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当父项在每条记录中具有不同的名称时,在mongodb集合中选择子元素_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

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

当父项在每条记录中具有不同的名称时,在mongodb集合中选择子元素,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我的mongodb集合有以下json格式,其中我需要选择子元素来执行计算,但父元素在每个记录中都有不同的名称 distribution是每个记录中的父元素,5d39e82f9ab1和5d09f133是可变子元素 我想选择并执行以下操作: 以下是可能的查询: "$project" : { "distribution.*.onBoardAgent" : 1, Difference: { $subtract: [ "$distributi

我的mongodb集合有以下json格式,其中我需要选择子元素来执行计算,但父元素在每个记录中都有不同的名称

distribution是每个记录中的父元素,5d39e82f9ab1和5d09f133是可变子元素

我想选择并执行以下操作:

以下是可能的查询:

"$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"
      ]
    }
  }
}