簡體   English   中英

插入到沒有$ position和$ each的MongoDB文檔數組的前面嗎?

[英]Insert into the front of a MongoDB document array without $position and $each?

當將流星應用程序部署到未更新到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

我實際上以為這真的很簡單,並發表了評論,但后來想到了,這確實是一個答案。

這取決於實際適合的情況,但是這里有兩種選擇。

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

    然后,“最新”條目將始終位於“最前面”,因為列表在每次更新時都按date屬性進行“排序”。 不知道您的流星版本還是MongoDB版本是否支持$sort而沒有$slice修飾符。 如果需要,可以將其設置為所需的最大大小,或者將其設置為大於最大預期條目的數字,這樣在后一種情況下不會起作用。

$position修飾符本身的用途是廣泛使用,而不是簡單地“預先添加”到數組中,因此在引入之前,總是有其他方法可以實現相同的目的。

在撰寫本文時,我相信無論如何它都不會變成“ minimongo”,因此無論服務器版本如何,任何客戶端代碼都將無法使用該運算符。 但是以上兩個選擇肯定會在客戶端工作。

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

刪除$position因為它僅在MongoDB 2.6中引入,並嘗試使用負索引進行此破解:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM