mongodb中对象数组中2个数字之间的差异

mongodb中对象数组中2个数字之间的差异,mongodb,aggregate,Mongodb,Aggregate,我使用的mongodb具有以下结构 { "_id" : ObjectId("5a868d785e5436aeed0502c0"), "symbol" : "ABC", "values" : [ { "High" : 53.0, "Close" : 51.85, "Open" : 50.8 }, { "High" : 51.35, "Close" : 50.25, "Open

我使用的mongodb具有以下结构

{
"_id" : ObjectId("5a868d785e5436aeed0502c0"),
"symbol" : "ABC",
"values" : [ 
    {
        "High" : 53.0,
        "Close" : 51.85,
        "Open" : 50.8
    }, 
    {
        "High" : 51.35,
        "Close" : 50.25,
        "Open" : 50.35
    }
  ]
}
我想计算close字段前两个元素的百分比变化

但在计算差异时 collection.values[0]。关闭-collection.values[1]。关闭

我得到的pricediff为null.PFB代码

db.getCollection('abc').aggregate(
{
 $project:
   {
      symbol:1,
      today: { $arrayElemAt: [ "$values.Close", 0 ] },
      yesterday: { $arrayElemAt: [ "$values.Close", 1 ] },
      pricediff: {
         $subtract: [ "$today", "$yesterday" ]
     }
 }})
还有没有其他方法来计算2个值的百分比变化

谢谢…J

任何新的(或重命名的)字段都不能在当前阶段中使用,只能在以后的阶段中使用

db.getCollection('abc').aggregate({
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
},
价格差异:{
//无法使用这些字段,因为它们是在此字段中创建的
//投影
$subtract:[“$today”、“$Dayed”]
}
}
})
由于新字段不能在创建的同一投影中使用,因此可以使用多个阶段或重复代码来访问要计算值的字段

使用两个投影阶段:
db.getCollection('abc').aggregate([{
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
}
}
}, {
$项目:{
符号:1,,
今天:1,,
昨天:1
价格差异:{
$subtract:[“$today”、“$Dayed”]
}
}
}
}]);
使用具有以下功能的单个投影台:
db.getCollection('abc').aggregate([{
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
},
价格差异:{
$let:{
变量:{
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
}
},
在:{
$subtract:[“$$今天”,“$$昨天”]
}
}
}
}
}]);
使用单个投影舞台(但更简洁):
db.getCollection('abc').aggregate([{
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
},
价格差异:{
$subtract:[
{$arrayElemAt:[“$values.Close”,0]},
{$arrayElemAt:[“$values.Close”,1]}
]
}
}
}]);
百分比变化只是以计算差异的相同方式添加正确的公式。

任何新的(或重命名的)字段都不能在当前阶段中使用,只能在以后的阶段中使用

db.getCollection('abc').aggregate({
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
},
价格差异:{
//无法使用这些字段,因为它们是在此字段中创建的
//投影
$subtract:[“$today”、“$Dayed”]
}
}
})
由于新字段不能在创建的同一投影中使用,因此可以使用多个阶段或重复代码来访问要计算值的字段

使用两个投影阶段:
db.getCollection('abc').aggregate([{
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
}
}
}, {
$项目:{
符号:1,,
今天:1,,
昨天:1
价格差异:{
$subtract:[“$today”、“$Dayed”]
}
}
}
}]);
使用具有以下功能的单个投影台:
db.getCollection('abc').aggregate([{
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
},
价格差异:{
$let:{
变量:{
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
}
},
在:{
$subtract:[“$$今天”,“$$昨天”]
}
}
}
}
}]);
使用单个投影舞台(但更简洁):
db.getCollection('abc').aggregate([{
$项目:{
符号:1,,
今天:{
$arrayElemAt:[“$values.Close”,0]
},
昨天:{
$arrayElemAt:[“$values.Close”,1]
},
价格差异:{
$subtract:[
{$arrayElemAt:[“$values.Close”,0]},
{$arrayElemAt:[“$values.Close”,1]}
]
}
}
}]);

百分比变化只是以计算差异的相同方式添加正确的公式。

这可以通过使用和以下算术运算符的单个管道完成:

db.getCollection('abc').aggregate([
    {
        "$addFields": {
            "pricediff": {
                "$subtract": [
                    { "$arrayElemAt": ["$values.Close", 0] },
                    { "$arrayElemAt": ["$values.Close", 1] }
                ]
            },
            "precentage_change": {
                "$multiply": [
                    {
                        "$cond": [
                            { "$eq": [{ "$arrayElemAt": ["$values.Close", 1] }, 0] },
                            1,
                            {
                                "$divide": [
                                    {
                                        "$subtract": [
                                            { "$arrayElemAt": ["$values.Close", 0] },
                                            { "$arrayElemAt": ["$values.Close", 1] }
                                        ]
                                    },
                                    { "$arrayElemAt": ["$values.Close", 1] }
                                ]
                            }
                        ]
                    },
                    100
                ]
            }
        }
    }
])

这可以通过使用和以下算术运算符的单个管道完成:

db.getCollection('abc').aggregate([
    {
        "$addFields": {
            "pricediff": {
                "$subtract": [
                    { "$arrayElemAt": ["$values.Close", 0] },
                    { "$arrayElemAt": ["$values.Close", 1] }
                ]
            },
            "precentage_change": {
                "$multiply": [
                    {
                        "$cond": [
                            { "$eq": [{ "$arrayElemAt": ["$values.Close", 1] }, 0] },
                            1,
                            {
                                "$divide": [
                                    {
                                        "$subtract": [
                                            { "$arrayElemAt": ["$values.Close", 0] },
                                            { "$arrayElemAt": ["$values.Close", 1] }
                                        ]
                                    },
                                    { "$arrayElemAt": ["$values.Close", 1] }
                                ]
                            }
                        ]
                    },
                    100
                ]
            }
        }
    }
])

计算百分比差异时;您的第二个引用不正确,即您正在调用collection.values[1]。请关闭,它应该是collection.values[1]。关闭它只是一个对我的操作方式的引用,也更正了这一点……在计算百分比差异时,实际的mongo DB代码低于此值;您的第二个引用不正确,即您正在调用collection.values[1]。请关闭,它应该是collection.values[1]。关闭这只是一个对我的操作方式的引用,也更正了这一点……实际的mongo DB代码低于回复感谢。但输出仅返回50条记录。任何从集合中检索所有记录的方法。谢谢回复。但输出仅返回50条记录。从集合中检索所有记录的任何方法。