用于查询日期范围的最佳NoSql?

mwj*_*son 4 couchdb mongodb cassandra nosql redis

给定一个商店,它是(近似)形式的JSON文档集合:

{
PeriodStart: 18/04/2011 17:10:49 
PeriodEnd: 18/04/2011 17:15:54
Count: 12902
Max: 23041 Min: 0
Mean: 102.86 StdDev: 560.97
},
{
PeriodStart: 18/04/2011 17:15:49 
PeriodEnd: 18/04/2011 17:20:54
Count: 10000
Max: 23041 Min: 0
Mean: 102.86 StdDev: 560.97
}... etc
Run Code Online (Sandbox Code Playgroud)

如果我想查询给定日期范围的集合(比如说过去24小时内的所有文档),这会给我最简单的查询操作吗?

进一步详细说明要求:

  • 它用于应用程序监视服务,因此不一定需要严格的CAP/ACID
  • 性能也不是主要考虑因素.读/写最多每秒10秒,无论如何都可以由RDBMS处理
  • 处理不断变化的文档模式的能力是可取的
  • 易于查询列表/集合的能力很重要(即席查询具有优势)

Dom*_*nes 6

我可能没有准确地查询您的查询要求,因为您没有指定.但是,如果您需要查找在特定范围内开始或结束的任何文档,则可以应用下面所写的大部分内容.如果这不是你想要的,那么我可以更多地帮助我们.:)

如果使用CouchDB,则可以通过将日期的各个部分拆分为数组来创建索引.([year, month, day, hour, minute, second, ...])

您的地图功能可能类似于:

function (doc) {
    var date = new Date(doc.PeriodStart);
    emit([ date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes() ] , null]);
}
Run Code Online (Sandbox Code Playgroud)

要执行任何类型的范围查询,您需要将开始和结束时间转换为相同的数组结构.从那里,您的视图查询将具有被称为startkey和的参数endkey.他们将分别接收开始和结束的数组参数.

因此,要查找过去24小时内开始的文档,除了视图本身的完整URI之外,还会发送这样的查询字符串:

// start: Apr 17, 2011 12:30pm ("24 hours ago")
// end:   Apr 18, 2011 12:30pm ("today")
startkey=[2011,04,17,12,30]&endkey=[2011,04,18,12,30]
Run Code Online (Sandbox Code Playgroud)

或者,如果您想要今年的所有内容:

startkey=[2011]&endkey=[2011,{}]
Run Code Online (Sandbox Code Playgroud)

请注意{}.用作结束[2011,{}][2012]时:与整理视图时相同.(任何格式都可以)

数组的额外组件将被忽略,但是您添加到阵列的进一步特异性,您的范围可以更具体.如果添加group_level参数,添加reduce函数在这里可能非常强大,但这超出了您的问题的范围.


mwj*_*son 1

我决定暂时使用 Mongo。

我发现设置/部署相对容易,并且C# 包装器足以满足我们想要做的事情(在无法做到这一点的情况下,我们可以轻松地诉诸 javascript 查询)。