【问题标题】:Node.js : Mongodb - Concurrent RequestsNode.js : Mongodb - 并发请求
【发布时间】:2014-02-02 14:44:13
【问题描述】:

在我的 node.js 应用程序中,路由在 Ajax 请求上执行,它总是接收并发请求。

我的要求是检查类似的文档,如果存在,将数据插入到现有文档中。如果没有类似的文档,则创建一个新记录。

参考下面给出的代码。问题是大多数时候“findExistingDoc”返回 false,但是当调用尝试创建新文档时,之前的调用已经创建了类似的文档。

请提供解决此问题的最佳解决方案。

self.findExistingDoc(function(err, doc){    //  Check if a similar doc already exist

    if (!doc){
        console.log ("NO existing doc");                    

        self.save(function(err, doc) {
            if (err) {
                console.error ("DB Error while creating new doc : " + JSON.stringify(err));
            } else {
                console.log ("New document created");
            }
        });
    } else {
        console.log ("existing doc");                   

        var qry = {"name": req.s_name, "class": req.s_class};
        self.model("Collection").findOneAndUpdate (qry,  {$addToSet: {"data": req.body.s_data}}, {safe: true, upsert: true}, function (err, album) {
            if (err) {
                console.error ("DB Error while adding data to existing doc : " + JSON.stringify(err));
            } else {
                console.log ("Data added to existing doc");
            }
            callback(err, output);
        });

    }
});

【问题讨论】:

  • doc的结构和正文中的s_data是什么
  • { s_name: "John", s_class: "Pre-Univ", data: [ { d1: "XYZ"}, {d1: "ABC"} ] }

标签: node.js mongodb concurrency


【解决方案1】:

在谷歌搜索后解决了我的问题。感谢 mongodb v2.4 中引入的新的“$setOnInsert”操作符。

var slug = getUniqueSlug("name");
var qry = {"name": req.s_name, "class": req.s_class};
var update = {"$addToSet": {"data": req.body.s_data}, "$setOnInsert": {"slug": slug}};
self.model("Collection").findAndModify ( qry, update, {"safe": true, "upsert": true} );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    相关资源
    最近更新 更多