通过时间戳和用户id过滤帖子(Filtering posts by timestamp and us

2019-09-29 13:36发布

我在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);
  }
}

而我通过用户id作为URL多个按键,但我老去结果

可有人提出一个解决办法?

Answer 1:

视图运行作为文档被添加/修改,并且仅在请求时或当自动更新。 它不会不断地重新运行,更重要的是,它不会重新运行已添加的文档。 所以,写你的观点将只包含老的效果。

你需要发出的所有文件,包括时间戳作为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意见工作,一个视图可能并不总是包含但所有数据(来自这里 ):

无论陈旧参数,文件只能由系统一旦文件已经保存在磁盘索引。 如果文档尚未保存到磁盘,使用陈旧的不会强迫这个过程。 您可以使用观察操作时,文件都保存在磁盘上和/或在索引更新来监视。

另外请注意,文件不立即添加到默认视图。 阅读此了解更多信息。



文章来源: Filtering posts by timestamp and userId