2015-02-24 78 views
0

我試圖實現當前單一視圖的前一個和下一個。我有當前id和搜索上下文slug。我將如何發佈和呈現當前文檔並鏈接到上一個和下一個 - 按搜索上下文過濾並按日期排序?這肯定是一個常見的問題,但我很難找到有效的方法。發佈前一個,下一個和下一個

查找selector可能不應該是id而是當前文檔的日期。

Meteor.publish('aPix', function(id, slug) { 
    check(id, String); 
    if (!slug) { 
     slug = 'all'; 
    } 
    // should the selector be the date instead? 
    var selector = id; 
    // how find this, next and previous documents only? 
    return MyPix.find(selector); 
}); 

我有這個,但無法找到如何實現它。我不知道這是一個好辦法:

var dateOfThisDoc = MyPix.findOne(id).uploadedAt; 

var nextDateDoc = MyPix.findOne(
    {uploadedAt: {$gt: dateOfThisDoc}}, 
    {"metadata.tags": slug} 
); 

謝謝!

回答

1

我不是100%確定你的目標是什麼,或者你的日期字段是如何工作的(或者你想從前一個/下一個記錄顯示的字段中查看當前字段),但是我會嘗試回答。

一種方法是在每個文檔中存儲上一個和下一個文檔的關鍵部分(排序鏈接列表方法)。那麼你只需要發佈當前的文檔,並且它會帶來一些數據點(比如標題),這些數據點可能來自其他客戶端。

從數據庫訪問角度來看,這可能是最有效的方法,假設您閱讀的內容比您添加/刪除新文檔的內容更多。儘管如此(取決於新文檔插入堆棧中間的方式和頻率),維護工作可能會比您想要的要多。所以,如果你想堅持上述做法,並找到日期前夕和未來所需文件,你可以這樣做:

MyPix.find(
    { 
    uploadedAt: {$gt: dateOfThisDoc}, 
    "metadata.tags": slug 
    },{ 
    {sort: {dateField: 1}}, 
    limit:1 
    } 
); 

尋找下一個崗位在當前操作後,並

MyPix.find(
    { 
    uploadedAt: {$lt: dateOfThisDoc}, 
    "metadata.tags": slug 
    },{ 
    {sort: {dateField: -1}}, 
    limit:1 
    } 
); 

爲前一個。

我認爲你需要/想單獨訂閱/發佈他們每個人。

有關排序/過濾語法的更多詳細信息,請參見http://docs.meteor.com/#/full/findhttp://docs.meteor.com/#/full/sortspecifiers

+0

謝謝!今晚會檢查這個。關於將下一個/以前的文檔寫入當前文檔,這不適用於不同的搜索上下文 - 除非每次觸發新的搜索時(如果我理解正確的話)都更新下一個/前一個字段。 – Kai 2015-02-24 20:09:55

+0

同意 - 如果您試圖展示一系列已經過濾搜索的文檔,那肯定無效。 – 2015-02-24 21:07:21

+0

再想一想,對於一些用例來說,鏈接它們可能是有意義的。例如,如果用戶可能希望遍歷任何給定搜索中的大部分文檔。在這種情況下,可能需要將已排序的集合拉一次併爲客戶端填充下一個/ prev信息,而不是在用戶遍歷時拉取每個項目。方法的選擇取決於文檔的大小與用戶可能查看的搜索集的比例(以及因此需要與上述代碼一起發生的數據庫過濾器/排序/限制的數量)。 – 2015-02-25 14:19:17