发布上一个,下一个,下一个

时间:2015-02-24 10:37:11

标签: javascript meteor

我正在尝试为当前单个视图实现上一个和下一个。我有当前的id和搜索上下文slug。如何发布和呈现当前文档以及前一个和下一个的链接 - 按搜索上下文过滤并按日期排序?这一定是一个常见的问题,但我找不到有效的方法。

查找selector可能不应该是id,而是当前文档的日期。

Meteor.publish('aPix', function(id, slug) {
    check(id, String);
    if (!slug) {
        slug = 'all';
    }
    // should the selector be the date instead?
    var selector = id;
    // how find this, next and previous documents only?
    return MyPix.find(selector); 
});

我有这个,但找不到如何实现它。而且我不确定这是一个好方法:

var dateOfThisDoc = MyPix.findOne(id).uploadedAt;

var nextDateDoc = MyPix.findOne(
    {uploadedAt: {$gt: dateOfThisDoc}},
    {"metadata.tags": slug}
);

谢谢!

1 个答案:

答案 0 :(得分:1)

我不是100%确定你的目标是什么,或者你的日期字段是如何工作的(或者你正在尝试从上一个/下一个记录中显示哪些字段,同时查看当前的记录),但我会尝试答案。

一种方法是在每个文档中存储上一个和下一个文档的关键部分(一种链表方法)。然后你只需要发布当前文档,它会带来你想要在客户端显示的其他数据点(例如,标题)。

从数据库访问角度来看,这可能是最有效的方法,假设您阅读的内容多于添加/删除新文档。但是,维护可能比您想要的更多(取决于新文档插入堆栈中间的方式和频率)。因此,如果您想坚持上述方法并且需要按日期查找前一个和下一个文档,您可以执行以下操作:

MyPix.find(
  {
    uploadedAt: {$gt: dateOfThisDoc}, 
    "metadata.tags": slug
  },{
    {sort: {dateField: 1}}, 
    limit:1
  }
);

查找当前帖子之后的下一篇文章

MyPix.find(
  {
    uploadedAt: {$lt: dateOfThisDoc}, 
    "metadata.tags": slug
  },{
    {sort: {dateField: -1}}, 
    limit:1
  }
);

对于前一个。

我认为您需要/希望为每个人单独订阅/发布。

有关排序/过滤语法的详细信息,请参阅http://docs.meteor.com/#/full/findhttp://docs.meteor.com/#/full/sortspecifiers