2016-07-21 79 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}) 

謝謝