Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.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 - Fatal编程技术网

如何在mongodb中存储和查询日常服务器使用数据

如何在mongodb中存储和查询日常服务器使用数据,mongodb,mongodb-query,Mongodb,Mongodb Query,我想在mongodb中存储我们服务器的每日cpu和磁盘统计数据,并在以后查询它们以进行分析,我想获得有关如何存储和查询数据的帮助 我尝试了以下结构,但在存储后无法查询特定日期/日期范围的数据 > > db.customer2.find() { "_id" : ObjectId("5a677a69b427f6a736044894"), "server" : "s1", "cpuload" : { "2017-11-04T00:00:00Z" : 50,"201

我想在mongodb中存储我们服务器的每日cpu和磁盘统计数据,并在以后查询它们以进行分析,我想获得有关如何存储和查询数据的帮助

我尝试了以下结构,但在存储后无法查询特定日期/日期范围的数据

    > 
    > db.customer2.find()
    { "_id" : ObjectId("5a677a69b427f6a736044894"), "server" : "s1", "cpuload" : { "2017-11-04T00:00:00Z" : 50,"2017-11-04T00:00:00Z" : 60 }, "disk_usage" : { "2017-11-04T00:00:00Z" : 90, "2017-11-05T00:00:00Z" : 90} }
    { "_id" : ObjectId("5a677a69b427f6a736044894"),  "server" : "s2", "cpuload" : { "2017-11-04T00:00:00Z" : 50,"2017-11-04T00:00:00Z" : 60 }, "disk_usage" : { "2017-11-04T00:00:00Z" : 90, "2017-11-05T00:00:00Z" : 90} }
    > 
    > db.stats2.find({"disk_usage":"2017-11-04T00:00:00Z"})
    >

将数据结构从键控名称-值对更改为嵌入文档的数组

"disk_usage":[
       {"date":ISODate("2017-11-04T00:00:00Z"),"value":60}, 
       {"date":ISODate("2017-11-05T00:00:00Z"),"value":90}
]
您可以使用应用日期字段的条件,当“磁盘使用情况”数组中有匹配的日期条目时,该字段将返回文档

您必须使用投影返回“disk\u usage”中匹配的日期元素


除了最初的问题是离题的(非常广泛和征求意见),您还建议了一个具有无界数组的解决方案,这必然会在规模和文档容量方面引起问题。@DavidMakogon请注意,此解决方案在文档容量方面与Op的解决方案没有什么不同。这使得数据可以查询和索引。mongodb中的所有查询和更新解决方案都是围绕嵌入式文档数组构建的。因此,这是最通用的数据建模方法,您可以随着数据的增长进行规划。抱歉,这根本不是事实。有可能超过文档大小的无界数组会导致应用程序失败,除了引入替代模型(或链文档)外,没有任何追索权。无界数组是文档数据库的“代码气味”。@DavidMakogon对不起,我不同意。您可以从包含所有日期的数组开始,然后随着数据的增长,您可以将数据拆分为不同的存储桶(年/月/日)文档,从而使数组保持文档容量,并使用聚合框架将数据合并在一起以生成输出。
db.col.find({"disk_usage.date":ISODate("2017-11-04T00:00:00Z")}) 
db.col.find({"disk_usage.date":ISODate("2017-11-04T00:00:00Z")}, {"disk_usage.$":1})