だからこれは奇妙です。mapreduce を使用して、一意のポートで日時/メトリックをグループ化しようとしています:
ドキュメントのレイアウト:
{
"_id" : ObjectId("5069d68700a2934015000000"),
"port_name" : "CL1-A",
"metric" : "340.0",
"port_number" : "0",
"datetime" : ISODate("2012-09-30T13:44:00Z"),
"array_serial" : "12345"
}
および mapreduce 関数:
var query = {
'array_serial' : array,
'port_name' : { $in : ports },
'datetime' : { $gte : from, $lte : to}
}
var map = function() {
emit( { portname : this.port_name } , { datetime : this.datetime,
metric : this.metric });
}
var reduce = function(key, values) {
var res = { dates : [], metrics : [], count : 0}
values.forEach(function(value){
res.dates.push(value.datetime);
res.metrics.push(value.metric);
res.count++;
})
return res;
}
var command = {
mapreduce : collection,
map : map.toString(),
reduce : reduce.toString(),
query : query,
out : { inline : 1 }
}
mongoose.connection.db.executeDbCommand(command, function(err, dbres){
if(err) throw err;
console.log(dbres.documents);
res.json(dbres.documents[0].results);
})
5、10、または 60 などの少数のレコードが要求された場合、期待どおりのすべてのデータが返されます。より大きなクエリは、切り捨てられた値を返します....
さらにテストを行ったところ、レコード出力が 100 に制限されているようです。これは詳細なデータであり、24 時間クエリを実行すると、1440 レコードが返されると予想されます... 80 を受け取って実行しただけです。:\
これは期待されていますか?私が言うことができるどこにも制限を指定していません...
その他のデータ:
2012-10-01T23:00 ~ 2012-10-02T00:39 (100 分) のレコードに対するクエリは、次のように正しく返されます。
[
{
"_id": {
"portname": "CL1-A"
},
"value": {
"dates": [
"2012-10-01T23:00:00.000Z",
"2012-10-01T23:01:00.000Z",
"2012-10-01T23:02:00.000Z",
...cut...
"2012-10-02T00:37:00.000Z",
"2012-10-02T00:38:00.000Z",
"2012-10-02T00:39:00.000Z"
],
"metrics": [
"1596.0",
"1562.0",
"1445.0",
...cut...
"774.0",
"493.0",
"342.0"
],
"count": 100
}
}
]
...クエリ 2012-10-01T23:00 - 2012-10-02T00:39 (101 minutes) にもう 1 分追加します。
[
{
"_id": {
"portname": "CL1-A"
},
"value": {
"dates": [
null,
"2012-10-02T00:40:00.000Z"
],
"metrics": [
null,
"487.0"
],
"count": 2
}
}
]
オブジェクトは、dbres.documents
正しいと予想される出力されたレコードを示します。
[ { results: [ [Object] ],
timeMillis: 8,
counts: { input: 101, emit: 101, reduce: 2, output: 1 },
ok: 1 } ]
...データがどこかに失われていますか?