【发布时间】:2013-05-23 13:42:25
【问题描述】:
我有以下格式的记录:
"_id" : "2013-05-23",
"authors_who_sold_books" : [
{
"id" : "Charles Dickens",
"num_sold" : 1,
"customers" : [
{
"time_bought" : 1368627290,
"customer_id" : 9715923
}
]
},
{
"id" : "JRR Tolkien",
"num_sold" : 2,
"customers" : [
{
"date_bought" : 1368540890,
"customer_id" : 9872345
},
{
"date_bought" : 1368537290,
"customer_id" : 9163893
}
]
}
]
}
每个日期都有一条记录,其中许多将包含同一作者。我正在查询返回以下内容的查询:
{
"_id" : "Charles Dickens",
"num_sold" : 235,
"customers" : [
{
"date_bought" : 1368627290,
"customer_id" : 9715923
},
{
"date_bought" : 1368622358,
"customer_id" : 9876234
},
etc...
]
}
我尝试了聚合、组、展开和项目的各种组合,但仍然无法达到目标,非常感谢任何建议。
对于额外的点,我实际上是使用 Ruby gem 来做这件事的,所以特定于此的代码会很棒。不过,我可以转换普通的 MongoDB 查询语言。
【问题讨论】:
-
你尝试过 MapReduce 吗?
-
我看到的最大问题是文档本身的存储方式。改变数据的结构是一种选择吗?我问的原因是,如果您将_ID字段设置为日期,并且每个日期文档都有一个客户数组,为什么您需要再次将日期存储在客户数组中?此外,文档的大小限制为 16mb,因此如果一天内有数百万的销售量,您可能会超过该文档大小限制。我认为如果每笔销售都是它自己的记录会更容易(再次推测),那么您可以使用聚合框架来创建您正在寻找的东西。
-
不,我还没有尝试过 MapReduce...
-
@Jesta 感谢您的反馈。数据来自每日数据转储。在我的真实情况下(不看书和作者!),id 实际上将类似于“2013-05-17_emails”、“2013-05-17_banner-ads”等,因此包含更多信息。此外,“date_bought”字段实际上是一个时间戳,所以我会改变我的问题以更好地反映这一点。我也可以保证,记录的数量永远不会在百万的范围内!谢谢。
标签: ruby mongodb aggregation-framework