2013-01-11 78 views
21

我們正在快速開發使用Mongoose的應用程序,並且我們的模式經常更改。我似乎無法找出更新現有文檔架構的正確方法,而不會將它們吹走並從頭開始徹底重新創建它們。我看到http://mongoosejs.com/docs/api.html#schema_Schema-add,這看起來是正確的。幾乎沒有關於如何真正實現這個的文檔,這使得對於MongoDB的新手很難。Mongoose更改模式格式

我只是想添加一個名爲enabled的新字段。我的模式定義如下:

var sweepstakesSchema = new Schema({ 
    client_id: { 
     type: Schema.Types.ObjectId, 
     ref: 'Client', 
     index: true 
    }, 
    name: { 
     type: String, 
     default: 'Sweepstakes', 
    }, 
    design: { 
     images: { 
      type: [], 
      default: [] 
     }, 
     elements: { 
      type: [], 
      default: [] 
     } 
    }, 
    enabled: { 
     type: Boolean, 
     default: false 
    }, 
    schedule: { 
     start: { 
      type: Date, 
      default: Date.now 
     }, 
     end: { 
      type: Date, 
      default: Date.now 
     } 
    }, 
    submissions: { 
     type: Number, 
     default: 0 
    } 
}); 

回答

10

Mongoose中沒有內置關於遷移現有文檔以符合模式更改的內容。根據需要,您需要在自己的代碼中執行此操作。在新的enabled字段的情況下,編寫代碼可能會最乾淨,以便將缺失的enabled字段視爲設置爲false,因此您不必觸摸現有文檔。

只要模式發生變化,您只需更新您的Schema定義,但是像default值這樣的新字段的變化只會影響前進的新文檔。

+0

*但像新字段的默認值更改只會影響新的文檔前進。* - 我想它也影響更新的文檔嗎? (不僅是新的) – Michael

+0

@邁克爾不是真的,不。使用默認值添加新字段將使這些字段出現在現有文檔的貓鼬實例中,但實際上它不會將字段添加到現有文檔中,即使您對它們調用了「保存」。 – JohnnyHK

+0

因此,在將'x'添加到具有默認值的模式後,以前沒有字段'x'的文檔將不會使用'x'更新文檔?我不明白這個設計的選擇,這是否記錄在某處?謝謝 – Michael

1

我也在尋找類似migrations的東西,但沒有找到它。作爲替代方案,您可以使用默認值。如果某個密鑰具有默認值,且該密鑰不存在,則它將使用默認值。

Mongoose Defaults

文檔骨架構造時的默認值被施加。這意味着如果您創建一個新文檔(新的MyModel)或者如果您找到一個現有文檔(MyModel.findById),那麼只要缺少某個關鍵字,二者都將具有默認值。

5
db.sweepstakesModel.find({ enabled : { $exists : false } }).forEach(
    function (doc) { 
     doc.enabled = false; 
     db.sweepstakesModel.save(doc); 
    } 
) 

考慮您的貓鼬型號名稱爲「sweepstakesModel」, 該代碼將與布爾值「假」添加「已啓用」場到您的收藏中的所有預先存在的文件。

+0

雖然這可能在理論上回答這個問題,但[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包括答案的基本部分,並提供供參考的鏈接。 –

+0

@bhargav,我用正確的貓鼬代碼更新了我的答案。請給它一個try.The代碼適用於我 – Vickar

+0

謝謝你。 –