我正在尝试使用 couchDb 视图解决看似相当简单的问题,但我的结果集甚至没有接近目标。
我没有更新文档,而是每次都创建一个新文档作为我的版本控制策略,并将这些文档与一个名为ver
. 版本链中的第一个文档将看到具有相同值的ver
字段和字段。_id
链中的所有后续文档将具有与链ver
中先前文档相同的字段,但将具有唯一的_id
字段。这些文档也有一个createdTime
字段,我可以通过该字段了解哪个文档是最新的。
这是我的文件:
{
"_id": "abcd-1234-efgh-9876",
"ver": "abcd-1234-efgh-9876",
"createdTime": "2020-01-12 01:15:00 PM -0600",
...
},
{
"_id": "uopa-3849-pmdi-1935",
"ver": "abcd-1234-efgh-9876",
"createdTime": "2020-02-16 02:39:00 PM -0600",
...
}
这是我的地图功能:
function (doc) {
emit(doc.ver, doc);
}
这是我的减少功能:
function(keys, values, rereduce) {
var latestVersions = {};
for (var i = 0; i < keys.length; i++) {
var found = latestVersions[keys[i][0]];
if (!found || found.createdTime < values[i].createdTime) {
latestVersions[keys[i][0]] = values[i];
}
}
return latestVersions;
}
最后,这是我想要的视图输出(只是我想要的文档):
{
"_id": "uopa-3849-pmdi-1935",
"ver": "abcd-1234-efgh-9876",
"createdTime": "2020-02-16 02:39:00 PM -0600",
...
}
我在这里想念什么?reduce 函数返回两条记录,这不是我想要的。我正在努力实现的目标是可能的,还是有更好的方法来解决这个问题?
更新
当使用单个键访问视图时,我能够让它工作,这是我的用例之一。
function (keys, values, rereduce) {
var toReturn = values[0];
for (var i = 1; i < values.length; i++) {
if (values[i].createdTime > toReturn.createdTime) {
toReturn = values[i];
}
}
return toReturn;
}
但是,我还有另一个用例将返回视图中的所有数据。所需的结果与上面相同,但我用于单个键的函数将只返回一个结果。如何使用共享键过滤多个值,例如 1 个“共享”键:n 值 -> 1 个键:1 值。