Node.js:Mongodb - 并发请求

时间:2014-02-02 14:44:14

标签: node.js mongodb concurrency

在我的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);
        });

    }
});

1 个答案:

答案 0 :(得分:0)

在一些谷歌搜索后解决了我的问题。感谢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} );