gpt4 book ai didi

arrays - couchdb 映射/减少按日期过滤的多个键

转载 作者:行者123 更新时间:2023-12-05 01:03:42 24 4
gpt4 key购买 nike

我有一个带有 map 减少的 View 设置。现在这段代码效果很好:

function(doc) {
if (doc.type == 'test'){
if(doc.trash != 1){
for (var id in doc.items) {
emit([id,doc.items[id].name], 1);
}
}
}
}

function(keys,prices){
return (keys, sum(prices));
}

我得到了返回,当使用 group 参数时,它可以很好地压缩一切。

我的问题/问题,我想添加第三个键....日期,所以我只能减少某些日期的记录。例如:
function(doc) {
if (doc.type == 'test'){
if(doc.trash != 1){
for (var id in doc.items) {
emit([date,id,doc.items[id].name], 1);
}
}
}
}

我的问题是,由于日期位于数组的开头,因此减少按日期、ID 等分组。我知道我使用 group_level 并说只从数组中获取第一个键或前 2 个键,但这无济于事要么是因为 afaik,group_level 在数组中从左到右。我可以将日期放在发出数组的末尾,但这也无济于事,因为我需要在 startkey 和 endkey 的开头设置值以进行搜索。

下面是一个输出数据的例子:
{"key":["2012-03-13","356752b8a5f6871f3","Apple"],"value":1},
{"key":["2012-03-20","123752b8a76986857","Pear"],"value":1},
{"key":["2012-04-12","3013531de05871194","Grapefruit"],"value":1},
{"key":["2012-04-12","356752b8a5f6871f3","Apple"],"value":1},

我想把 APPLE 加到一行,这里先按日期加苹果。如果我将 DATE 作为数组中的第一个键删除,我能够成功地将所有苹果加起来,但是我无法按日期范围进行搜索。

关于如何实现这一点的任何想法?

最佳答案

如果我正确理解您想要做什么,那么您希望将日期作为数组的第一个元素,并使用 group_level 以及 start_key 和 end_key。

例如。 startkey=[1, "someid"] endkey=[1,"someid",{}] group_level=2
将为您提供从日期 1 开始的所有项目(显然在这里选择您自己的格式),ID 为“someid”和任何名称。您在名称之前发出 id 似乎很有趣,并且没有更多关于您实际尝试完成的内容的信息,很难建议您的通用数据模型。如果 ID 是一个“类型”ID,意味着许多项目共享相同的 ID,那么这是有道理的。如果 ID 是每个项目 ID 的唯一 ID,则不是。在这种情况下,您希望在 ID 之前发出“名称”...

编辑 1

根据您的评论,做一个 范围 你这样做的日期:
startkey=[1] endkey=[5,{}] group_level=2
您将获得按 id 分组的从日期 1 到日期 5 的所有内容,即。 apples , oranges等等。我在非常大规模的生产应用程序中使用这种精确的技术。我实际上将日期格式化为 yyyymmdd 格式的易于人类阅读的整数,因此 20140624 将排在最前面。如果我想要从月初到现在按我的组 ID 分组的所有内容,我打电话
startkey=[20140601] endkey=[20140624,{}] group_level=2
它工作得很好,据我所知,这就是你想要做的。我还有第三个关键层“细节”,它允许我为需要它的项目提供更深层次的分组。然后我可以打电话
startkey=[20140601, "someid"] endkey=[20140624, "someid",{}] group_level=3
要钻取特定 ID 的详细信息级别,或仅使用带有 group_level=3 的先前查询如果我想要每个 ID 的详细信息。我确信您可以完成这项工作 - 我已经使用所描述的技术在生产应用程序中解决了这个确切的问题。

编辑 2

如果您想将所有苹果分组而不考虑日期,那么您需要让苹果成为键中的第一个元素。然后,您可以使用 group_level=1 在 View 结果中将所有苹果作为单行获取。 ,以及使用 group_level=2 的日期范围内的苹果.这里的区别在于您只能执行 group_level=2一次查询一个项目类型。如果您想要两全其美,不幸的是,您只需要制作 2 个 View 。这就是关键排序的工作原理......如果您需要对两种类型的查询、日期范围内的所有项目类型以及未按日期分组的所有特定项目的快速响应时间,我相信 2 个 View 是实现的唯一方法那。

备注

另一件需要注意的事情是关于你的 reduce 函数。只要可能,它是 高度建议您使用内置的reduce 函数。它们是在 erlang 中实现的,并且与自定义 javascript reduce 函数相比进行了高度优化。

在你的情况下,只需用这个替换你的减少功能
_sum
轻松嘿?

如果您发布有关您的应用程序、数据模型等的更多信息,那么我很乐意为您的数据库设计提供更多帮助。

关于arrays - couchdb 映射/减少按日期过滤的多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24337156/

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