Meteor JS中的排序

Sorting in Meteor JS

本文关键字:排序 JS Meteor      更新时间:2023-09-26

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

当您指定根据多个属性排序时,Mongo将首先根据第一个属性进行排序,然后对于位于同一"位置"的文档,它将使用您的第二个属性来排序,等等。

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

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

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

只有当JavaScript实现保留了对象中键的顺序时,[{a: 1, b: -1}]表单才会起作用。大多数人在大多数时候都会这样做,但这取决于你自己。

最后,你可能已经找到了这种排序:

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

你可能想做一些类似的事情

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

希望它能起作用

如果不尝试添加此

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

感谢