【发布时间】:2015-09-22 18:35:55
【问题描述】:
我有一个大致如下的 Mongodb 架构:
[
{
"name" : "name1",
"instances" : [
{
"value" : 1,
"date" : ISODate("2015-03-04T00:00:00.000Z")
},
{
"value" : 2,
"date" : ISODate("2015-04-01T00:00:00.000Z")
},
{
"value" : 2.5,
"date" : ISODate("2015-03-05T00:00:00.000Z")
},
...
]
},
{
"name" : "name2",
"instances" : [
...
]
}
]
每个元素的实例数量可能非常大。
我有时只想获取数据的一个样本,也就是说,每 3 个实例或每 10 个实例获取一次……你懂的。
我可以通过获取所有实例并在我的服务器代码中过滤它们来实现这个目标,但我想知道是否有办法通过使用一些聚合查询来实现。
有什么想法吗?
更新
假设数据结构如@SylvainLeroux 建议的那样平坦,即:
[
{"name": "name1", "value": 1, "date": ISODate("2015-03-04T00:00:00.000Z")},
{"name": "name2", "value": 5, "date": ISODate("2015-04-04T00:00:00.000Z")},
{"name": "name1", "value": 2, "date": ISODate("2015-04-01T00:00:00.000Z")},
{"name": "name1", "value": 2.5, "date": ISODate("2015-03-05T00:00:00.000Z")},
...
]
获取每第 N 个项目(特定name)的任务会更容易吗?
【问题讨论】:
-
FWIW: “每个元素的实例数量可能会很大。” 如果文档数量如此之多,这里使用嵌入式文档可能不是一个好主意大到它最终可以达到 32MB 的限制。此外,如果您经常需要访问该“大”数组的子集,则可能是该模式不合适的另一个线索。在不知道您的确切需求的情况下,我会想到更像
{ "name" : "name1", value: 1, date: ... }, { "name" : "name1", value: 2, date: ... }, ...的东西。使用该架构,您甚至可以(ab)使用 _id 字段来选择一个有偏见的数据样本。 -
@SylvainLeroux,实例共享的不仅仅是一个名称(为了这个问题的目的,我简化了架构)。我不希望每个实例都包含与其他实例基本相同的数据,因此我有一个包含多个实例的父对象。这样对我来说更有意义。但我愿意接受建议......
标签: mongodb mongodb-query aggregation-framework