2015-08-15 47 views
1

將流星應用部署到未更新到Mongo 3.0的沙箱MongoDB時,我無法使用$position$each查詢。

是否有另一種方式來實現我在做這些查詢?

我想將任務添加到數組的前面。

下面是該方法的代碼:

newTask: function(task, date, number) { 

    if (! Meteor.userId()) { 
     throw new Meteor.Error("not-authorized"); 
    } 

    if(number === 0){ 
     projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.0.tasks': { $each: [{name: task, date: date}], $position: 0}}}) 
    } else if(number === 1){ 
     projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.1.tasks': { $each: [{name: task, date: date}], $position: 0}}}) 
    } else if(number === 2){ 
     projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.2.tasks': { $each: [{name: task, date: date}], $position: 0}}}) 
    } else if(number === 3){ 
     projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.3.tasks': { $each: [{name: task, date: date}], $position: 0}}}) 
    } 
} 

但從本質上講,我怎麼能重新

projectsDB.update({user: Meteor.user()._id}, {$push: {'panels.3.tasks': { $each: [{name: task, date: date}], $position: 0}}}) 

不使用$position$each

+0

如何創建項目?我在儀表板路線 –

+0

您需要在儀表板上註冊一次,然後點擊「創建新的」 –

+0

噢好吧......出於某種原因,當您在小屏幕上時該塊不顯示。我認爲你必須在那裏使用'check()'作爲你的三個參數,但是首先你可以通過做'meteor logs panls.meteor.com'來粘貼服務器上的錯誤。 –

回答

1

其實我認爲這是真的很簡單,並評論,但隨後想到它和它的真的是一個答案。

這取決於哪種情況下實際適合,但有兩個替代這裏。

  1. 只是繼續將項目添加到陣列與標準$push操作。無論如何,這只是「追加」(而不是預先)。

    projectsDB.update(
        { user: Meteor.user()._id }, 
        { $push: { 
         'panels.0.tasks': { name: task, date: date } 
        }} 
    ) 
    

    因此,不用擔心支持的修飾符,因爲所有新條目只是回到前面而不是前面。

    但是,當您讀取數據時,您需要做的就是將JavaScript .reverse()應用到該數組。該結構是簡單的,只是無論是把它放在一個幫手或東西內,需要以「發佈」:

    var projects = projectsDB.find(query).fetch(); 
    projects.forEach(function(project) { 
        project.panels.forEach(function(panel) { 
         panel.tasks.reverse(); // reverses the order 
        }); 
    }) 
    

    你只需要知道,如果你「發佈」這樣的預先處理之前再次.reverse()附加其他任何東西。所以可能更適合只有顯示助手。

  2. 由於我在那裏看到一個「日期」,因此您希望「最新的任務」成爲第一個列出的項目似乎是合乎邏輯的。所以,你真正需要做的,是應用$sort改性劑,它已支持:通過日期屬性

    projectsDB.update(
        { user: Meteor.user()._id }, 
        { $push: 
         { 'panels.0.tasks': { 
          $each: [{name: task, date: date}], 
          $sort: { date: -1 } 
         }} 
        } 
    ) 
    

    那麼「最新」項將始終是在「前」爲列表「排序」每次更新。不確定流星版本或MongoDB版本是否支持$sort而沒有$slice修飾符。如果需要,只需將其設置爲所需的最大尺寸或大於最大預期條目的數字,以便在後一種情況下不起作用。

$position改性劑本身的目的是爲不是簡單地「預待定」到數組更廣泛的使用,所以一直存在其他的方式來實現同樣的事情,它的出臺了。

在撰寫本文時,我認爲這還沒有成爲「minimongo」,因此無論服務器版本如何,任何客戶端代碼都無法使用該操作符。但上述兩個選擇肯定會爲客戶端工作。

+0

非常感謝所有的信息,我最終實際上只是使用了一個完整的部署,它具有$ position準備好使用,因爲我有多個需要db主機的web應用程序,但第一個方法可以完成這項工作!我已經嘗試了第二個,但不幸的是,這並沒有工作,但這是由於我使用矩形()。格式,所以它實際上不是一個日期,所以我可以使用createdAt和新的日期()來解決這個問題,日期我我正在使用對用戶來說更具審美性。它現在在http://panls.io上運行,謝謝你們! –

0

從您的過去的問題編輯,這是服務器提示:MongoError: $each term takes only $slice (and optionally $sort) as complements

刪除$position,因爲它僅被MongoDB中2.6引入,使用負指標試試這個技巧:

{ 
    $set: { 
    'panels.0.tasks.-1': {name: task, date: date} 
    } 
} 
+0

嗨,我添加了「projectsDB.update({user:Meteor.user()._ id},{$ push:{'panels.0.tasks':{$ each:[{name:task,date:date} ],$ sort:{date:-1}}}})「並且它不具有所需的效果,當我添加新任務時,它以原始順序顯示,最新顯示在底部,任何想法? –

+0

我更新了我的答案。嘗試使用$集合中的負指數。我暫時沒有想法。 –

+0

另外,添加一個模板「加載」以擺脫其他錯誤。 –

相關問題