【发布时间】:2016-06-30 18:44:31
【问题描述】:
我正在使用:
- 猫鼬 4.4.7
- 节点 4.2.6
- mongodb 3.2.4
- 异步 1.5.2
我的运动模式:
var mongoose = require("mongoose");
var Schema = require('mongoose').Schema;
var sportSchema = new Schema ({
name: { type: Schema.Types.Mixed, required: true},
provider_id: { type: Number,index: true, unique: true, sparse: true},
sort: { type: Number, default: -1},
state: {type:String, default: "stopped",select: false},
date: { type: Date, required: true, default: Date.now, select: false}
})
module.exports = mongoose.model("Sport", sportSchema);
我的连接文件:
var mongoose = require('mongoose');
var env = process.env.NODE_ENV;
var db_name = "project";
if (env === "test") {
db_name = db_name+"_test";
}
var url = 'mongodb://localhost/'+db_name;
var db_connected = function() {
console.log("Database " + db_name + " connected");
}
mongoose.connect(url,db_connected);
module.exports = mongoose;
此函数处理从 xml 文件导入的运动:
function processSport(sport,cb) {
async.waterfall([
// Look for sport
function (next) {
Sport.find({provider_id: sport.provider_id}).limit(1).exec(function(err){
if (err) {
console.log("Couldn't find sport:",err)
return next(err)
}
}).then(function(db_sport){
return next(null,db_sport)
})
},
function(db_sport,next) {
if (!db_sport.length) {
//Create sport
db_sport = new Sport({provider_id: sport.provider_id,name:sport.name});
db_sport.save(function(err){
if (err) {
console.log("Couldn't save sport:",err)
return next(err)
}
}).then(function(db_sport){
return next(null,db_sport)
})
// End create sport
} else {
return next(null,db_sport[0])
}
}
], function (err,db_sport){
cb(null,db_sport)
})
}
我的问题是,如果我有多个包含相同 2 项运动的文件,则处理速度非常快,以至于 Sport.find() 方法找不到刚刚创建的运动。
文件处理如下:
function processByFile(env,files,main_callback) {
async.each(files, function(file,file_callback) {
var xml = FileHelper.readXMLFile(env, file);
processFile(xml,file_callback)
}, main_callback())
}
function processFile(xml,file_callback) {
xmlParser(xml, function (err, sports_data) {
if (err) {
return file_callback(err)
} else {
if (sports_data != null) {
//Actual processing starts here
async.each(sports_data, function (sport, sport_callback) {
processSport(sport,function (err,db_sport){
console.log(db_sport._id + "-" +db_sport.provider_id)
sport_callback()
})
},file_callback())
}
}
})
}
如果我传入两个包含两个相同运动的文件。输出如下:
//2 duplicate key warnings
56e7e9cf12d821c1b0b4130b-5
56e7e9cf12d821c1b0b4130a-2
在我添加唯一索引之前,已创建 4 项运动。
我尝试在我的 mongod 实例上设置 --syncdelay 0 和 --journalCommitInterval 2 ,但它仍然找不到瞬态(或者在它们被保存并被承诺返回 2ms 后它们是什么/任何地方)文档。在生产模式下,文件将每 10 秒到达一次,所以这不是什么大问题。但是当我想重读很多文件时,这可能会变得很糟糕。
有人知道我错过了什么吗?
提前致谢!
【问题讨论】:
-
设置
var mongoose = require('mongoose').set('debug', true);告诉我,所有finds都在第一次插入之前执行。所以 async.waterfall 的某些东西是错误的(我猜)。
标签: node.js asynchronous mongoose