別のブログ投稿で「フィールド名を照会できますか」という答えを見つけました。これは、MapReduce関数alaでのみキーを反復処理することを示しています(ブルースが示唆するように):
var d = 0;
for (var key in this.values)
d = Math.max(d, parseInt(key));
MMS の例のスキーマ (以下の v とラベル付けされた値の配列で、timestamp_minute と days を月で入れ替える) のデータと、最新のメトリック日付を生成するクエリを次に示します。
db.metricdata.find();
/* 0 */
{
"_id" : ObjectId("5277e223be9974e8415f66f6"),
"month" : ISODate("2013-10-01T04:00:00.000Z"),
"type" : "ga-pv",
"v" : {
"10" : 57,
"11" : 49,
"12" : 91,
"13" : 27,
...
}
}
/* 1 */
{
"_id" : ObjectId("5277e223be9974e8415f66f7"),
"month" : ISODate("2013-11-01T04:00:00.000Z"),
"type" : "ga-pv",
"v" : {
"1" : 145,
"2" : 51,
"3" : 63,
"4" : 29
}
}
そしてマップ縮小機能:
db.metricdata.mapReduce(
function() {
var y = this.month.getFullYear();
var m = this.month.getMonth();
var d = 0;
// Here is where the field names used
for (var key in this.v)
d = Math.max(d, parseInt(key));
emit(this._id, new Date(y,m,d));
},
function(key, val)
{
return null;
},
{out: "idandlastday"}
).find().sort({ value:-1}).limit(1)
これは次のようなものを生成します
/* 0 */
{
"_id" : ObjectId("5277e223be9974e8415f66f7"),
"value" : ISODate("2013-11-04T05:00:00.000Z")
}