进入MongoDB已有3天了,但我觉得它不太流畅。我只是试图计算一个字段的平均时间,但我一直遇到各种各样的问题。
这是我的代码:
db.results.group({
key:{"profile.Zend_Http_Client_Adapter_Socket::read==>fgets":{$exists:true}},
initial: {count: 0, total:0},
reduce: function(doc, out){
out.count++;
out.total += doc."profile.Zend_Http_Client_Adapter_Socket::read==>fgets.wt";
},
finalize: function(out){
out.avg = out.total/out.count;
}
});
错误:
语法错误:意外的字符串
上面是一个非常幼稚的错误,但是我不明白为什么会这样说,我想到的唯一合理的原因是,我在这里指定的键是用引号引起的,因此Mongo感到困惑。
但是,这些键在我的收藏夹中用引号引起来,因此应该没有理由继续保持此语法错误正确吗?
样本文件:
{
"_id" : ObjectId("532a2a986803faba658b456b"),
"profile" : {
"main()==>register_shutdown_function" : {
"ct" : 1,
"wt" : 13,
"cpu" : 0,
"mu" : 1568,
"pmu" : 1000
},
"main()==>load::htdocs/index.php" : {
"ct" : 1,
"wt" : 17,
"cpu" : 0,
"mu" : 1736,
"pmu" : 4296
},
{"Zend_Http_Client_Adapter_Curl::write==>curl_exec" : {
"ct" : 3,
"wt" : 54782314,
"cpu" : 16001,
"mu" : 83288,
"pmu" : 49648
}, ....
根据评论,您的问题是形成有效JavaScript的问题之一。同样,您的“关键”值似乎并不是您真正想要的。但是,您应该偏爱使用聚合功能而不是使用“组”
db.results.aggregate([
{ "$match": {
"$and": [
{ "profile.Zend_Http_Client_Adapter_Socket::read==>fgets.wt": {
"$exists": true
}},
{ "profile.Zend_Http_Client_Adapter_Socket::read==>fgets.wt": {
"$not": { "$type": 2 }
}}
]
}},
{ "$group": {
"_id": null,
"total": { "$sum":
"$profile.Zend_Http_Client_Adapter_Socket::read==>fgets.wt"
},
"count": { "$sum": 1 }
}},
{ "$project": {
"_id": 0,
"avg": { "$divide": [ "$total", "$count" ] }
}}
])
聚合管道取代了之前引入的功能,例如group
和distinct
。除琐碎的操作外,所有其他操作都应该是您的首选。
它会以更快的速度运行,并且会以本机代码(而不是JavaScript引擎)进行处理。
另请参阅文档中的SQL到聚合的映射表。
您的样本不是很完整。为了解决所有问题,我必须将这样的文档放进去:
{
"profile": {
"Zend_Http_Client_Adapter_Socket::read==>fgets": {
"ct" : 3,
"wt" : 54782314,
"cpu" : 16001,
"mu" : 83288,
"pmu" : 49648
},
}
}
此外,您的文档示例中包含一些无效字段:
{
"_id" : ObjectId("532a2a986803faba658b456b"),
"profile" : {
"main()==>register_shutdown_function" : {
"ct" : 1,
"wt" : 13,
"cpu" : 0,
"mu" : 1568,
"pmu" : 1000
},
"main()==>load::htdocs/index.php" : { <-- Invalid
"ct" : 1,
"wt" : 17,
"cpu" : 0,
"mu" : 1736,
"pmu" : 4296
},
因此该字段不能存在,因为它.
在字段名称中具有,出于明显的子文档原因,不允许使用该名称。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句