gpt4 book ai didi

nosql - CouchDB 建模 - 时间过滤和分组数据

转载 作者:行者123 更新时间:2023-12-02 04:02:59 28 4
gpt4 key购买 nike

我正在尝试建立对 CouchDB 以及如何为某些现实世界场景建模数据的理解。我现在已经尽可能多地“按日期获取我的博客文章”;)

给定这样的文件:

{
"_id": "couch1",
"_rev": "2-338d0a592ad1e5570000002b00000000",
"eventType": "event1",
"date": 1328805860000
}

{
"_id": "couch2",
"_rev": "1-1e0315c2e1ca7f5f0000002b00000000",
"eventType": "event1",
"date": 1328133600000
}

{
"_id": "couch3",
"_rev": "1-154cd416b78cb2ef0000002b00000000",
"eventType": "event2",
"date": 1325434920000
}

如果日期是一个纪元,是否可以要求 Couch 创建一个 View ,在该 View 中您要求在两个时间戳之间发生的所有“事件”,然后按“事件类型”对该数据进行分组?

因此,使用上述方法并假设传入的时间戳包含这些文档 - 我们希望看到输出:
"event1": 2
"event2": 1

我获得的更多信息

我知道 Couch 会按键排序,所以如果我想要“前 10 名”,那将是第二阶段,但我可以处理。

所以这里的核心问题是你按一列过滤,然后按另一列分组?

如果我们使用下面的 map 函数:
function (doc) {
emit([doc.date, doc.eventType], doc.eventType);
}

count reduce 函数我们看到,因为时间戳本质上是唯一的,所以 Couch 无法分组,并且 key 的值为 1。

因此,您可以将 map 功能更改为以下内容:
function (doc) {
emit([doc.eventType, doc.date], doc.eventType);
}

然后更改 group level到 1 将按事件正确分组,但您的数据不能按时间切片,因为您的主要排序是按事件名称,这意味着时间排序现在已损坏?

人们有这方面的 war 故事吗?这需要通过重新减少来完成吗?

非常感谢任何花时间阅读本文的人

艾格西

最佳答案

我会建议一个 View /列表组合:

看法:

"eventByDate": 
{
"map": "function(doc) { emit(doc.date, doc.eventType);}"
}

列表:
"test": "function(head,req) {
var eventO=new Object();
while(row=getRow()) {
if(eventO[row.value]==undefined) {
eventO[row.value]=1;
}else{
eventO[row.value]++;
}
}
send("[");
for (var curEvent in eventO) {
send ("{\"event\":\""+curEvent +"\",\"count\":"+eventO[curEvent]+"}");
}
send("]");
}"

结果:
[
{"event":"event2","count":1}
{"event":"event1","count":2}
]

但是您必须在此处或在您的后端手动按计数排序(我没有实现)

关于nosql - CouchDB 建模 - 时间过滤和分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9215414/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com