当前位置: 首页 > 知识库问答 >
问题:

node.js Mongodb回调问题

岳景明
2023-03-14

我的应用程序应该更新,如果tmx是新的,如果旧的什么都不做,如果不存在插入文件。如果文档被插入,它工作完美,否则它不能正确更新或说E11000 dup密钥。想弄清楚我的回调是不是错了还是逻辑。(我是node.js+MongoDB的新手)MongoClient=require(“MongoDB”).MongoClient,assert=require(“assert”),url=“MongoDB://localhost:27017/pfc”;

    MongoClient.connect(url, function (err, db) {
        run(db);
    });


    function run(db) {
        fs.readFile('log.log', 'utf8', function (err, source) {
            if (err) throw err;
            var dataFile = JSON.parse(source);
            dataFile.forEach(function (item) {
                upsert(db, item, function (err, result) {
                    if (err) console.dir(err);

                });
            });
        })
    }

    function upsert(db, doc, callback) {

    db.collection('flags').findOne({vid: doc.vid}, function (err, item, result) {

        if (item.vid != null) {
            if (!(item.tmx instanceof Date)) {
                item.tmx = new Date(item.tmx)
            }
            if(!(doc.tmx instanceof Date)){
                doc.tmx = new Date(doc.tmx)
            }

            if (item.tmx < doc.tmx) {
                console.dir("Date validation")
                db.collection('flags').updateOne({vid: item.vid}, {
                        $set: {
                            "tmx": doc.tmx
                        }
                    },{upsert:true}, function (err, result) {
                        callback(err, result);

                    }
                )

                callback(err, result);
            }
            else{
                console.dir("older")
                callback(err, result);
            }
        }
        else {
            db.collection('flags').insertOne(doc, function(err, result) {
                callback(err, result);
            });
        }
    })}

编辑:“log.log”文件中的文档具有以下结构:

在@Aaron Dufour的帮助下,我解决了回调问题,谢谢:)但现在的问题是,当我已经填充了集合并在log.log中查找最新的文档时,它从最旧的文档开始直到最新的:(

共有1个答案

轩辕涵亮
2023-03-14

您的upsert易受竞争条件的影响,而run多次并行调用它,所以这可能就是问题所在。还不清楚doc到底是什么样子的,因此您可能需要稍微复杂一些的逻辑,但这里有一个版本使用Mongo的upsert来使事情更安全一些:

function upsert(db, doc, callback) {
  db.collection('flags').update({vid: doc.vid}, {$set: doc}, {upsert: true}, function(err) {
    db.collection('flags').update({vid: doc.vid, tmx: {$lt: doc.tmx}}, {$set: tmx: doc.tmx}, function(err) {
      callback();
    });
  });
}
 类似资料:
  • 我正在玩mongob,并将一些测试数据{name:"david"}输入到“用户”集合中。我通过键入mongoshell验证了数据在MongoDB中 结果: 在 node.js 脚本中,使用以下代码: 不返回任何结果 我没有发现任何错误,也没有错误。请告知

  • 为什么我不能使用“findOne()”只返回一个字段?在下面的代码中,所有字段都返回。我也尝试了“findOne()”,但仍然不起作用。有人能告诉我是我弄错了还是怎么回事吗? 在这种情况下,我只想返回“信息”字段 文档如下所示:

  • 我不确定Twilio Authy的register\u user()的成功回调是否正在启动。在我的代码中 尽管新用户已成功添加到Authy,且响应状态为200。 我想在register\u user()的成功回调中设置authyUsrId的值,并在发送给POST请求的JSON响应中使用它。 但在回应中,我只得到了这个 <代码>{姓名:'你好'} 是否有任何方法可以调试register\u user

  • 我正在尝试从承载在MLab上的MongoDB访问该文档,但在访问带有_id的文档时出现以下错误。以下是供您参考的代码 但在尝试访问URL时出现以下错误:http://localhost:3000/api/v1/todo/5870f7f1f36d2872530d26f1 TypeError:hex不是函数处的函数。从(本机)at函数。from(本机)位于C:\Kamlesh\Angular2\mea

  • 我正在使用带有代码交换验证密钥(PKCE)的OAUTH2.0身份验证服务来访问Spotify令牌。我用我的BundleID和重定向URI在Spotify注册了我的应用程序。 问题是,在我输入了Spotify登录的电子邮件和密码后,我会用URL中的代码重定向到RedirectUri,但什么也没有发生。 这里是我的代码: 身份验证用户的代码 这正确地打开了我的Safari,但随后我用访问URL中的令牌

  • 信任问题 在顺序的大脑规划和JS代码中回调驱动的异步处理间的不匹配只是关于回调的问题的一部分。还有一些更深刻的问题值得担忧。 让我们再一次重温这个概念——回调函数是我们程序的延续(也就是程序的第二部分): // A ajax( "..", function(..){ // C } ); // B // A和// B现在 发生,在JS主程序的直接控制之下。但是// C被推迟到 稍后 再发生,