【问题标题】:Sorting in Meteor JSMeteor JS 中的排序
【发布时间】:2016-11-24 09:35:41
【问题描述】:

我在 MeteorJS 中编写了一个小代码,它使用 Mongodb 和 Iron:router(我是 MeteorJS 的新手)。最初一切正常,到最后,排序停止工作。为了解释更多,网站列表必须根据收到的赞成票和创建日期进行排序。以下是代码的相关部分:

//Sorting websites based on userfilter or votes
websites:function(){
  if (Session.get("userFilter")){
    return Websites.find({ createdBy: Session.get("userFilter") }, { sort: { createdOn: -1, up: -1 }});
  } else {
    return Websites.find({},{ sort: { createdOn: -1, up: -1 }});
  } 
},
{{#each websites}}
  <div class="col-xs-12 col-md-3">
    <div class="thumbnail">
      <a href="{{url}}" class="site_name">{{title}}</a>
      <p class="site_desc">{{description}}</p>
      <br>
      <p class="upvote_button">Upvote: {{up}}</p>
      <p class="downvote_button">Downvote: {{down}}</p>
      <a href="#" class="btn btn-default js-upvote" id="upvote_button">
        <span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
      </a>
      <a href="#" class="btn btn-default js-downvote" id="downvote_button">
        <span class="glyphicon glyphicon-arrow-down" aria-hidden="true"></span>
      </a>
      <br>
      <p class="added-by">Added By: 
        <a href="#" class="js-filter">{{getUser createdBy}}</a>
      </p>
      <p>Added On: {{createdOn}}</p>
      <a href="/single_website/{{_id}}">Details</a>
    </div>
  </div>
{{/each}}

【问题讨论】:

    标签: javascript mongodb meteor


    【解决方案1】:

    当您指定根据多个属性进行排序时,Mongo 将首先按第一个属性排序,然后对于位于相同“位置”的文档,它将使用您的第二个属性对它们进行排序,依此类推。

    因此,您将首先获得按createdOn 日期排序的文档(网站),对于具有完全相同日期(包括时间,如果存在)的文档(网站),则按up 值排序。我想这不是你想要的。

    此外,由于您使用字典/映射对象类型来指定排序,因此您将依赖于 JS 引擎排序实现。在大多数情况下,它会按插入顺序对您的属性进行排序,即 1) createdOn 2) up 在您的情况下。

    http://docs.meteor.com/api/collections.html#sortspecifiers

    [{a: 1, b: -1}] 表单仅在您的 JavaScript 实现保留对象中键的顺序时才有效。大多数情况下,大多数情况下都会这样做,但您可以确定。

    最后,您可能已经找到了这种排序方式:

    Websites.find({}, {
      sort: [
        ["up", "desc"], // Sort first by "up" value
        ["createdOn", "desc"] // then for websites with same up value, order by date
      ]
    })
    

    【讨论】:

      【解决方案2】:

      你可能不想做这样的事情

      Websites.find({}).sort({createdOn:-1, up:-1})
      

      希望有效果

      如果不尝试添加这个

      Websites.ensureIndex({createdOn: -1, up: -1})
      

      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-23
        • 2015-12-19
        • 2015-12-30
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多