1

I have this MongoDB group-by query which works great from the Mongo console:

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:

  • Is there an easier way of generating this timestamp: ISODate("2012-08-12T00:00:00Z")? Can I use a date function to generate this timestamp? If so, how?
  • How can I sort (asc/desc) the returned results by the grouped fields: "failed" or "succeeded"?
  • Finally, how would I export the output to a flat file?

Update

For #3, I was basically looking for this:

mongo my_db --eval 'some_var=X;' --quiet my_script.js >> output.txt

Where my_db is the database I'm using, some_var is a variable I'm passing to my_script.js which contains my group-by query. output.txt is obviously where the output is written.

4

1 回答 1

0
  1. 您可以使用支持此日期表示法的 JSDate对象(http://www.w3schools.com/js/js_obj_date.asp),但是您所做的方式通常是制作日期的最佳方式,ISO 日期总是更好这就是为什么 Mongo 在 v1.6 或 8 中从普通Date对象更改为这些对象(现在不记得了:\)。

  2. 由于 group 返回单个 BSON 文档(这意味着结果不能大于 16meg),因此您必须在客户端对它们进行排序。更正:您无法对传入的查询进行排序,因为它是我刚刚意识到的单个对象。所以这是客户端的事情。尽管如果您使用 MR(我认为),您可以做到这一点。

  3. 只需将返回的结构写入平面文件即可。它是一个单独的文档,我不知道您希望如何将结果格式化为平面文件或您希望使用哪种语言处理它,但通常您会从(例如)PHP 触发 group 命令并继续工作它在那里。在这些类型的语言中更容易。

注意: Group() 不适用于分片,我认为聚合框架(http://docs.mongodb.org/manual/applications/aggregation/)几乎可以取代它。

于 2012-08-15T20:13:49.403 回答