我有一个MongoDB group-by查询,它在Mongo控制台上运行得很好:
db.accounts.group(
{ cond: { "created_at" : { $gte: ISODate("2012-08-12T00:00:00Z") }}
, key: {member_id: true}
, initial: {count: 0, failed: 0, succeeded: 0}
, reduce: function(doc, out) {
out.count++;
if (!doc.success)
out.failed++
else
out.succeeded++
}
});
My three questions:
-
有没有更简单的方法来生成此时间戳:ISODate("2012-08-12T00:00:00Z")?我可以使用日期函数来生成此时间戳吗?如果是这样,怎么样?
-
如何按分组字段对返回的结果进行排序(asc / desc):"failed"或"succeeded"?
-
最后,如何将输出导出到平面文件?
Update
对于#3,我基本上是在寻找这个:
mongo my_db --eval 'some_var=X;' --quiet my_script.js >> output.txt
my_db是我正在使用的数据库,some_var是我传递给my_script.js的变量,它包含我的group-by查询 . output.txt显然是输出的写入位置 .
1 回答
您可以使用支持此日期表示法的JS
Date
对象(http://www.w3schools.com/js/js_obj_date.asp),但是您完成它的方式通常是制作日期的最佳方式,ISO日期总是更好,这就是为什么Mongo从普通的Date
对象更改为关于v1.6或8(现在不能记住:\
) .由于组返回单个BSON文档(这意味着结果不能大于16meg),您必须对它们进行客户端排序 . 更正:您无法对传入的查询进行排序,因为它是我刚才意识到的单个对象 . 所以这是客户端的事情 . 如果你使用MR(我估计),你可以这样做 .
只需将返回的结构写入平面文件即可 . 它是一个单独的文档,我不知道你希望如何将结果格式化为平面文件或者你想要处理它的语言,但是通常你会从例如PHP(例如)PHP中激活group命令并继续工作它在那里 . 这些语言更容易 .
注意:Group()不支持分片,聚合框架(http://docs.mongodb.org/manual/applications/aggregation/)几乎可以取代我认为 .