我在Couchbase中有以下对象:
{
"postReplyId": "Reply_9AE1F47E585522FD1D2EFFEA7671C0855BBFDA991698B23886E37D1C65DAC8AF_1375468399745",
"userId": "User_9AE1F47E585522FD1D2EFFEA7671C0855BBFDA991698B23886E37D1C65DAC8AF",
"postId": "Message_9AE1F47E585522FD1D2EFFEA7671C0855BBFDA991698B23886E37D1C65DAC8AF_1375457606125",
"post_reply_message": "Testing",
"attachments": {
"images": [
],
"audio": [
],
"videos": [
]
},
"upVoters": [
],
"downVoters": [
],
"upVotes": 0,
"report": 0,
"reporters": [
],
"timestamp": 1375468399745,
"mtype": "reply"
}
我希望有一个视图,并返回用户30 minutes
x
内创建的所有帖子
我做了:
function (doc, meta) {
if(doc.mtype == "reply") {
var dt = new Date();
if((dt.getTime() - doc.timestamp) < 1800000 )
emit(doc.userId, doc);
}
}
我将userIds作为URL中的多个键传递,但是我得到了旧结果
有人可以建议解决方案吗?
答案 0 :(得分:3)
视图在添加/修改文档时运行,并且仅在请求时或自动更新时运行。它不会不断重新运行,更重要的是,它不会为已添加的文档重新运行。因此,如您所写,您的视图将只包含旧结果。
您需要发出所有文档并将时间戳作为emit的一部分包含在内,以便您可以将其用作查看查询的一部分(时间范围)。
因此,在您的emit函数中,您可能会改为(未经测试的代码):
function (doc, meta) {
if (doc.mtype === "reply") {
// dt will be when the document is processed by the view, which may
// not when the document was added.
var dt = new Date();
var year = dt.getFullYear();
var month = dt.getMonth() + 1; // make month 1-12
var day = dt.getDate();
var hours = dt.getHours();
var minutes = dt.getMinutes();
var seconds = dt.getSeconds();
// emit the full key, including the user id and the date of the document.
emit([doc.userId, year, month, day, hours, minutes, seconds], doc._id);
}
}
然后你的查询可能就像这个范围(为便于阅读而分成几行):
/salamis_db/_design/docs/_view/by_user_date?
startkey=["the-userId", 2013, 8, 7, 10, 30, 0]
&endkey=["the-userId", 2013, 8, 7, 11, 00, 00]
虽然endkey
并非严格必要,但为了清楚起见,我已将其保留。
由于Couchbase视图的工作方式,视图可能并不总是包含所有数据(来自here):
无论陈旧参数如何,文档只能被索引 一旦文档被持久化到磁盘,系统就会出现。如果 文件没有被持久化到磁盘,使用陈旧不会 强迫这个过程。您可以使用观察操作来监视何时 文档将持久保存到磁盘和/或在索引中更新。
另请注意,默认情况下,文档不会立即添加到视图中。请阅读this以获取更多信息。