【问题标题】:Meteor Subscribe doesn't update sort order of collection流星订阅不更新集合的排序顺序
【发布时间】:2013-02-15 16:41:28
【问题描述】:
// Snippet from Template
<div class="post-container">
  {{#each elements}}
    {{> post-element this}}
  {{/each}}
</div>

// Snippet from Client 
Meteor.subscribe('thePosts');

// Snippet from Server
Meteor.publish('thePosts', function(){
  return Posts.find({},  {sort:{createdAt:-1}, reactive:true});
});

当我这样做时……

Posts.insert({body:postBody, createdAt: new Date()});

发布文档被添加并显示在我的列表末尾,而不是我的发布函数中指定的降序。知道我做错了什么吗?

谢谢!

【问题讨论】:

    标签: node.js mongodb meteor


    【解决方案1】:

    发布功能确定哪些记录应同步到任何订阅客户端的 mini-mongo 数据库。所以在发布函数中对数据进行排序实际上对客户端没有影响,因为客户端数据库可能会以其他方式存储它们。

    当然,您可能希望在发布者的find 中使用排序,以便将记录数限制为最近的 N 条 - 但同样,这只是决定哪些记录被同步而不是如何同步的一种方式由客户端存储/使用。

    记录同步到客户端后,由模板代码决定结果的显示方式。例如:

    Template.myTemplate.elements = function() {
      return Posts.find({}, {sort: {createdAt:-1}});
    }
    

    另请参阅我在 common mistakes 上的帖子的“排序发布”部分。

    【讨论】:

    • 大卫,这确实是我想要回答的问题!很好的答案,非常感谢!
    • 非常感谢!你刚刚为我节省了大量时间:-)
    • 这些天来,我在 SO 上最喜欢的时刻之一是提出流星问题,找到 David Weldon 的答案,并在投票时微笑。干杯大卫(&ty)
    【解决方案2】:

    您没有发布您的模板助手代码。

    当您从辅助函数执行return Posts.find() 时,查询还应包含排序参数,如下所示:

    Template.myTemplate.elements = function(){
       Meteor.subscribe('thePosts');
       return Posts.find({},  {sort:{createdAt:-1}, reactive:true});
    }
    

    【讨论】:

    • 模板函数在响应式上下文中运行,因此不需要reactive:true
    • 是的,我以为它默认为 true,我只是在搞乱不同的解决方案。
    • sohel,你说得对,帮助函数应该进行过滤。发布将同步文档推送到浏览器。我现在明白这里发生了什么谢谢大家!
    • 如果你想根据地理位置进行排序呢?好像该字段没有被 MongoDB 公开。
    • 当您在客户端对大量数据进行排序时,它会挂起浏览器
    猜你喜欢
    • 2013-03-18
    • 2013-01-02
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    相关资源
    最近更新 更多