我有一个 CouchDB,其中包含名为 save_data(我需要的实际数据)、rel(作为相关帐户 - 链接到该文档的帐户)和 created_at(创建日期)的项目。当我第一次创建我称之为最近项目的视图时,我认为该视图中的项目是按照创建它们的顺序排序的,但没过多久我就发现我错了。我想获取与一个用户相关的所有文档(rel,在我的 js 中调用 db.view 函数的 save_profile),然后根据 created_at 对它们进行排序,所以我创建了地图函数:
function(doc) {
if (doc.rel) {
var p = doc.save_data || {};
var r = doc.rel || {};
var q = doc.created_at || {};
emit([doc.rel], {save_data: doc.save_data, rel: doc.rel});
}
};
然后我用这些参数调用它:
db.view(design + "/recent-items", {
descending : "true",
limit : 10,
update_seq : true,
key : [save_profile],
success : function(data) {
...somecode...
}
});
然后我注意到它们没有按我想要的顺序出现,而是按他们的 ID 排序,这现在很有意义,但这不是我需要的。所以我这样做了:我重新设计了 map 函数,以便它在键中显示用户和日期(作为要排序的字段)
function(doc) {
if (doc.rel) {
var p = doc.save_data || {};
var r = doc.rel || {};
var q = doc.created_at || {};
emit([doc.rel, doc.created_at], {save_data: doc.save_data, rel: doc.rel});
}
};
然后我在 db.view 中使用 startkey 而不是 key ,如下所示:
db.view(design + "/recent-items", {
descending : "true",
limit : 10,
update_seq : true,
startkey : [save_profile, null],
success : function(data) {
...somecode...
}
});
这样我就可以获得与 save_profile 相关的所有文档,但也按日期排序。我确实得到了它们,但我也用它从其他用户那里得到了文件,所以这个功能完全不可靠。我当时所做的也是实现 endkey ,如下所示:
db.view(design + "/recent-items", {
descending : "true",
limit : 10,
update_seq : true,
startkey : [save_profile, null],
endkey : [save_profile, {}],
success : function(data) {
...somecode...
}
});
但后来我得到空视图。我使用的日期格式如下:
"2013-05-13T11:59:22.281Z"
和配置文件是这样的:
{"rand":"0.26928815129213035","nickname":"Nickname","email":"Label for Gravatar","url":"URL","gravatar_url":"http://www.gravatar.com/avatar/35838c85593335493a1fa916863fee0c.jpg?s=40&d=identicon","name":"testacc"}
我还尝试将开始/结束键中的 [] 和 {} 替换为“0000-00-00T00:00:00.000Z”和“9999-99-99T99:99:99.999Z”,但没有任何改变。所以...有什么想法吗?据我在其他类似问题中看到的,人们只是使用 {} 作为结束键并离开 startkey 而没有第二个参数,但这在这里也不起作用。
编辑:解决了!好吧,伙计们,信不信由你,我是这样做的:我将地图功能更改为显示创建于和配置文件以这种方式:
function(doc) {
if (doc.rel) {
var p = doc.save_data || {};
var r = doc.rel || {};
var q = doc.created_at || {};
emit([doc.rel, doc.created_at], {save_data: doc.save_data, rel: doc.rel});
}
};
如果在设置开始键和结束键之前将descending 设置为true,则必须反转搜索间隔,以便endkey 包含起始值,startkey 包含结束值,如下所示:
db.view(design + "/recent-items", {
descending : "true",
update_seq : "true",
startkey : [save_profile.name, save_profile.rand, {}],
endkey : [save_profile.name, save_profile.rand, null],
inclusive_end : "true",
success : function(data) {
...somecode...
}
});
这成功了,它完美地工作(但也完全没有逻辑)。