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/7/arduino/2.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组查询总是返回0?_Mongodb_Aggregation Framework - Fatal编程技术网

为什么下面的mongodb组查询总是返回0?

为什么下面的mongodb组查询总是返回0?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有下面的json示例,它似乎不太难。 基本上,我试图按照算法字段对所有对象进行分组,然后根据$difference.close字段计算平均值 下面是一个示例对象 { "_id" : ObjectId("56b0c702c783c42f504f006c"), "symbol" : "ALSK", "algorithm" : "AvgForecaster", "date" : "2016-02-01", "real_quote" : { "t

我有下面的json示例,它似乎不太难。 基本上,我试图按照算法字段对所有对象进行分组,然后根据$difference.close字段计算平均值

下面是一个示例对象

{
    "_id" : ObjectId("56b0c702c783c42f504f006c"),
    "symbol" : "ALSK",
    "algorithm" : "AvgForecaster",
    "date" : "2016-02-01",
    "real_quote" : {
        "trade_date" : "2016-02-01",
        "open" : "1.6",
        "close" : "1.59",
        "low" : "1.57",
        "high" : "1.66",
        "volume" : "65600",
        "symbol" : "ALSK",
        "adjusted_close" : "1.59"
    },
    "forecasted_quote" : {
        "trade_date" : "2016-02-01",
        "open" : "0.0",
        "close" : "1.92",
        "low" : "0.0",
        "high" : "0.0",
        "volume" : "0",
        "symbol" : "ALSK",
        "adjusted_close" : "0.0"
    },
    "difference" : {
        "trade_date" : "2016-02-01",
        "open" : "1.6",
        "close" : "-0.33",
        "low" : "1.57",
        "high" : "1.66",
        "volume" : "65600",
        "symbol" : "ALSK",
        "adjusted_close" : "1.59"
    }
}
然后查询如下:

db.getCollection('Accuchecks').aggregate([
{
    $group: {
        _id: "$algorithm",
        accuracy: {$avg: "$difference.close"}
     }
}])
然后我得到以下结果:

{
    "result" : [ 
        {
            "_id" : "DeltaForecaster",
            "accuracy" : 0.0000000000000000
        }, 
        {
            "_id" : "AvgForecaster",
            "accuracy" : 0.0000000000000000
        }
    ],
    "ok" : 1.0000000000000000
}
查询是否没有选取$difference.close字段?在整个集合中,该值几乎从不为0


谢谢

您将返回一个0,因为您将
close
值存储为字符串而不是浮点数。聚合管道中没有可用的类型转换函数,因此您必须将值存储为数值,请参阅本节,了解如何更改现有数据的类型

{
    "_id" : ObjectId("56b0c702c783c42f504f006c"),
    "symbol" : "ALSK",
    "algorithm" : "AvgForecaster",
    "date" : "2016-02-01",
    "real_quote" : {
        "trade_date" : "2016-02-01",
        "open" : 1.6,
        "close" : 1.59,
        "low" : 1.57,
        "high" : 1.66,
        "volume" : 65600,
        "symbol" : "ALSK",
        "adjusted_close" : 1.59
    },
    "forecasted_quote" : {
        "trade_date" : "2016-02-01",
        "open" : 0.0,
        "close" : 1.92,
        "low" : 0.0,
        "high" : 0.0,
        "volume" : 0,
        "symbol" : "ALSK",
        "adjusted_close" : 0.0
    },
    "difference" : {
        "trade_date" : "2016-02-01",
        "open" : 1.6,
        "close" : -0.33,
        "low" : 1.57,
        "high" : 1.66,
        "volume" : "65600",
        "symbol" : "ALSK",
        "adjusted_close" : .59
    }
}

不,它正在选择
$difference。关闭
字段很好,但因为它包含字符串值,
$avg
运算符将不起作用,只对数字字段起作用。因此,请更改您的模式,以便
$difference.close
字段保存数值。非常感谢。。。这很简单:db.getCollection('Accuchecks').find({}).forEach(函数(obj){obj.difference.close=parseFloat(obj.difference.close);db.getCollection('Accuchecks').save(obj);});