我在 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
The [
{a: 1, b: -1}
] form will only work if your JavaScript implementation preserves the order of keys in objects. Most do, most of the time, but it’s up to you to be sure.
最后,您可能会寻找这种排序:
Websites.find({}, {
sort: [
["up", "desc"], // Sort first by "up" value
["createdOn", "desc"] // then for websites with same up value, order by date
]
})
关于javascript - Meteor JS 中的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38493281/