2014-05-20 69 views
0

此代碼旨在批量更改MongoDB集合中的所有文檔。但運行此代碼後,集合中的文檔完全沒有變化。它有什麼問題?爲什麼不保存這些MongoDB文檔更改?

var mongoose = require('mongoose'), 
    async = require('async'), 
    Person = require('../../model/Person'); 

mongoose.connect('mongodb://localhost/people-questions'); 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 

Person.find(function (err, people) { 
    if (err) return console.error(err); 

    //download bio info 
    async.each(people, function(person, callback) { 
     person.birthdateYear = '01'; 
     person.save(); 
     callback(); 
    }); 

    mongoose.connection.close(); 
}); 

我覈實,沒有留下一個蒙戈CLI比如在終端打開並運行db.people.find();實地看不更新可言,所做的更改,並詢問諸如db.people.find({ "_id" : ObjectId("5379e6e21fe1e8e2fc364d17")});,引用特定的ID驗證我的Javascript代碼確實連接到正確的數據庫,並使用正確的集合(該ID來自以前的腳本,使用相同的連接詳細信息來打印文檔ID)。

另外,我正在使用貓鼬。在創建原始文檔之後,Mongoose Schema被更新爲包含諸如birthdateYear之類的額外字段,但是從我已經完成的Google搜索和Mongo Docs閱讀中,似乎Schema更改應該不需要任何特殊工作 - 您可以設置屬性立即對更新模式的文檔(反正應該可以)。

回答

1

究其原因,更新不堅持的是,之前的保存()回調有機會完成對MongoDB的連接被關閉。通過確保在關閉連接之前完成所有save()回調,數據將被保存。

0

person.save是一個異步函數 嘗試像

person.save (function(err){ 
    if(err) console.log(err); 
    callback(); 
}); 
+0

這並沒有解決問題。 save()的回調也是可選的。 – Trindaz