2016-07-21 82 views
1

我写了一个使用Mongodb和铁的MeteorJS的小代码:路由器(我是MeteorJS的新手)。一切工作正常,并在最后,排序停止工作。要多解释一下,网站列表必须根据收到的赞誉和创建日期进行排序。下面是代码的有关章节:排序在流星JS

//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}} 

回答

0

当您根据多个属性指定排序时,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 
    ] 
}) 
0

你可能想OT做这样的事

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

希望工程

如果不尝试添加该

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

谢谢