Mongoose找不到刚刚保存的数据

时间:2016-03-15 11:01:40

标签: node.js asynchronous mongoose

我正在使用:

  • mongoose 4.4.7
  • node 4.2.6
  • mongodb 3.2.4
  • async 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个文件。输出如下:

//2 duplicate key warnings
56e7e9cf12d821c1b0b4130b-5
56e7e9cf12d821c1b0b4130a-2

在我添加唯一索引之前,已经创建了4项运动。

我尝试在我的mongod实例上设置--syncdelay 0--journalCommitInterval 2,但它仍然没有找到瞬态(或者在它们被保存并返回之后的2ms内)承诺)文件。在生产模式下,文件将每10秒到达一次,因此这不是一个大问题。但是,当我想重读大量文件时,这可能会变得很讨厌。

有人知道我错过了什么吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

function processPrematchOddsByFile(env,files,main_callback) {
async.eachSeries(files, function(file,file_callback) {
    var xml = FileHelper.readXMLFile(env, file);
    processPrematchOdds(xml,file,file_callback)
}, main_callback())

}

eachSeries代替each

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()
                return file_callback()
            })

        })

    }
}
})

}
运动处理中的

file_callback(),因为这是解析的xml文档的顶层。

这就是诀窍。现在查询按预期顺序排列,一切都按预期工作。