【问题标题】:Why does the following mongodb group query return always 0?为什么下面的 mongodb 组查询总是返回 0?
【发布时间】:2016-02-03 16:47:09
【问题描述】:

我有以下示例 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。

谢谢

【问题讨论】:

  • 不,它可以很好地选择$difference.close 字段,但是因为它包含字符串值,$avg 运算符将不起作用,仅在数字字段上起作用。因此,请更改您的架构,以便 $difference.close 字段包含数值。

标签: mongodb aggregation-framework


【解决方案1】:

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

{
    "_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
    }
}

【讨论】:

  • 非常感谢...这很简单:db.getCollection('Accuchecks').find({}).forEach( function(obj) { obj.difference.close = parseFloat( obj.差异.close ); db.getCollection('Accuchecks').save(obj); } );
猜你喜欢
  • 2021-01-24
  • 1970-01-01
  • 2017-12-12
  • 2016-09-16
  • 2020-05-25
  • 2013-02-26
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多