在一个长的一维列表中,键始终按从最小到最高的顺序排序。 (我试图直观地描述这一点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
功能)。请记住,即使在我的第一个示例中,日期也没有完美排序。