Mongoose 没有找到刚刚保存的数据

Posted

技术标签:

【中文标题】Mongoose 没有找到刚刚保存的数据【英文标题】:Mongoose doesn't find just saved data 【发布时间】: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 的某些东西是错误的(我猜)。 【参考方案1】:
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 文档的顶层。

这成功了。现在查询按预期顺序出现,一切都按预期工作。

【讨论】:

以上是关于Mongoose 没有找到刚刚保存的数据的主要内容,如果未能解决你的问题,请参考以下文章

如何承诺 Mongo/Mongoose 找到

将 Mongo/Mongoose 对象保存在另一个模型中

Mongo (+Mongoose) 错误:无法找到 $geoNear 查询的索引

Mongoose、Cygwin 和 MongoDB - 不保存

Mongoose、Cygwin 和 MongoDB - 不保存

使用Mongoose(ORM)将多个应用程序与一个mongo数据库连接