gpt4 book ai didi

json - CouchDB 通过三个索引键查询和过滤

转载 作者:行者123 更新时间:2023-12-01 07:43:53 24 4
gpt4 key购买 nike

我目前正在尝试按具有三个值的键进行排序和排序。但是让我们从文档结构开始:

{
_id: "DOCIDGOESHERE01",
type: "MESSAGE",
date: "2011-08-24 06:49:02",
author: "USERIDGOESHERE01",
receiver: ["USERIDGOESHERE02", "USERIDGOESHERE03"],
message: "ok let's do this"
}

主要目标是查询 couchDB 中选定用户发送给特定用户的消息,并按日期排序。有些消息没有任何接收者,表明它们是公开的,任何人都可以阅读。

我目前使用的 map 功能是这样的:
function map(doc) {
if(doc.receiver.lenth==0)
emit([doc.date, null, doc.author], doc._id);
else for(var idx in doc.receiver)
emit([doc.date, doc.receiver[idx], doc.author], doc._id);
}

在查询 couchDB HTTP 接口(interface)时,我尝试了类似的请求
HTTP GET xxx/messages?key=[{}, "USERIDGOESHERE02", {}]

或者
HTTP POST xxx/messages
{
keys: [
[{}, "USERIDGOESHERE02", "USERIDGOESHERE01"],
[{}, "USERIDGOESHERE02", "USERIDGOESHERE03"],
[{}, "USERIDGOESHERE02", "USERIDGOESHERE04"],
]
}

但所有这些都没有导致我想要生成的文件列表。你对这个任务有什么建议吗?还是不可能用 couchDB 构建这样的过滤结果?
非常感谢您!

最佳答案

在一个长的一维列表中,键总是从小到大排序。 (我试图在 The Parable of CouchDB 中直观地描述这一点,但不知道我是否成功了!)

从小到大排序的数组是什么样的?如果您读取 View 中的所有键,则左侧值变化最小;中间值的变化大于左侧;右手边的值变化最大。换句话说,数组键告诉 CouchDB,“第一优先级是按 key[0] 排序,如果相等,则决胜局将是 key[1] ;如果它们也相等,则下一个决胜局是 key[2] 等……”

因此,您可能希望您的 key 看起来像这样:

[ "receiver_1", null      , a_date       ],
[ "receiver_1", "sender_A", some_date ],
[ "receiver_1", "sender_B", another_date ],
[ "receiver_2", "sender_A", fourth_date ],
[ "receiver_3", "sender_C", fifth_date ],

要从 sender_B 和公共(public)消息中查找 receiver_1 的所有消息,您需要两个查询,一个用于 "receiver_1", null配对,另一个用于 "receiver_1", "sender_B" .您想知道任何日期,因此您需要一系列与发送方/接收方匹配的行。不幸的是,HTTP POST 查询不支持这一点。

您可以简单地查询每个选定的发送者(甚至同时使用线程或异步编程)。接收者和发送者是已知的,此示例允许从最小值 ( null) 到最大值 ( {}) 的范围,这将包括所有日期。
?startkey=["receiver_1",null,null]&endkey=["receiver_1",null,{}]
?startkey=["receiver_1","sender_B",null]&endkey=["receiver_1","sender_B",{}]

另一种选择是简化您的 key 并删除日期。
[ "receiver_1", null      ],
[ "receiver_1", "sender_A"],
[ "receiver_1", "sender_B"],
[ "receiver_2", "sender_A"],
[ "receiver_3", "sender_C"],
[ "receiver_3", "sender_C"],
[ "receiver_3", "sender_C"],
[ "receiver_3", "sender_C"],
[ "receiver_3", "sender_C"],

现在您可以再次使用 HTTP POST API 进行查询。消息将返回不按日期排序。这还不错,您可以在客户端(或 _list 函数)上对它们进行排序。请记住,即使在我的第一个示例中,日期也没有完美排序。

关于json - CouchDB 通过三个索引键查询和过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7170659/

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