CouchDB 通过三个索引键进行查询和过滤

2024-05-21

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

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

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

我当前使用的地图功能如下所示:

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 接口时,我尝试了类似的请求

HTTP GET xxx/messages?key=[{}, "USERIDGOESHERE02", {}]

or

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

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


在一个长的一维列表中,键始终按从最小到最高的顺序排序。 (我试图直观地描述这一点CouchDB 的寓言 https://web.archive.org/web/20160327064036/http://www.iriscouch.com/blog/2011/06/the-parable-of-couchdb但不知道我是否成功了!)

按从小到大排序的数组是什么样的?如果您读取视图中的所有键,则左侧的值变化最小;中间的值比左边的值变化更大;右边的值变化最大。换句话说,数组键告诉 CouchDB,“首要任务是排序key[0],如果相等,则决胜局将是key[1];如果它们也相等,则下一个决胜局是key[2], ETC...”

因此,您可能希望您的密钥如下所示:

[ "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 的 receive_1 的所有消息以及公共消息,您需要两个查询,一个查询"receiver_1", null配对,另一个用于"receiver_1", "sender_B"。你想知道任何日期,所以你需要一个range与发送者/接收者匹配的行。不幸的是,HTTP POST 查询不支持这一点。

您可以简单地查询每个选定的发送者(甚至可以使用线程或异步编程同时查询所有发送者)。接收方和发送方已知,并且此示例允许从最小值 (null)到最大的({}),其中将包括所有日期。

?startkey=["receiver_1",null,null]&endkey=["receiver_1",null,{}]
?startkey=["receiver_1","sender_B",null]&endkey=["receiver_1","sender_B",{}]

另一种选择是简化您的密钥并删除日期。

[ "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 进行查询。消息将会返回not按日期订购。这还不错,您可以在客户端(或_list功能)。请记住,即使在我的第一个示例中,日期也没有完美排序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CouchDB 通过三个索引键进行查询和过滤 的相关文章

随机推荐