1

我将我的数据保存在 MongoDb 中

{
  "_id": "ObjectId(\"5fec31b6b9022035abbbf7cc\")",
  "message": {
    "date": "2020-12-30 13:20:26",
    "time": "2020-12-30T07:50:26.000Z",
    "ID": "005",
    "P": 1.36
  }
},
{
  "_id": "ObjectId(\"5fec31b5b9022035abbbf7c2\")",
  "message": {
    "date": "2020-12-30 13:20:24",
    "time": "2020-12-30T07:50:24.000Z",
    "ID": "005",
    "P": 1.5
  }
 
},
{
  "_id": "ObjectId(\"5fec31b0b9022035abbbf7b3\")",
  "message": {
    "date": "2020-12-30 13:20:19",
    "time": "2020-12-30T07:50:19.000Z",
    "ID": "005",
    "P": 1.63
  }
  
}

我想找到每分钟 P 值的平均值。我在 MongoDb 中以 15 分钟的时间间隔尝试了 Group 结果, 但在时间字段中出现错误。

db.pressure.aggregate([
  { "$group": {
    "_id": {
      "year": { "$year": "message.time" },
      "dayOfYear": { "$dayOfYear": "message.time" },
      "hour": { "$hour": "message.time" },
      "interval": {
        "$subtract": [ 
          { "$minute": "message.time" },
          { "$mod": [{ "$minute": "message.time"}, 1] }
        ]
      }
    },
      
  
    "count": { "$sum": 1 }
  }
  }
  
])

{“消息”:“无法从 BSON 类型字符串转换为日期”,“ok”:0,“code”:16006,“codeName”:“Location16006”,“name”:“MongoError”}

4

1 回答 1

2

几个修复:

  • 您需要使用$toDate (From MongoDB 4.0)将字符串日期转换为日期类型,$addFields将字段更新message.time为日期类型
  • $year, $hour等运营商需要使用 $ 符号来引用字段,您错过了它message.time
  • 用于$avg获取平均值message.P
db.collection.aggregate([
  { $addFields: { "message.time": { $toDate: "$message.time" } } },
  {
    "$group": {
      "_id": {
        "year": { "$year": "$message.time" },
        "dayOfYear": { "$dayOfYear": "$message.time" },
        "hour": { "$hour": "$message.time" },
        "interval": {
          "$subtract": [
            { "$minute": "$message.time" },
            { "$mod": [{ "$minute": "$message.time" }, 15] }
          ]
        }
      },
      "count": { "$count": 1 },
      "average": { "$avg": "$message.P" }
    }
  }
])

操场


MongoDB 3.6:您可以使用$dateFromString

  {
    $addFields: {
      "message.time": {
        $dateFromString: { dateString: "$message.time" }
      }
    }
  }

操场

于 2020-12-30T12:40:11.290 回答