什么是在函数中包装mongo查询/插入以使其可重用的正确方法?我有一个更新操作,可能发生在各个地方,只想写一次并重用它。我使用MongoJS与MongoDb API进行交互。
当我采取以下内容时:
mongo.myt.update(
{'_id': req._id},
{
$addToSet: {
"aggregate.clientIds": req.myt.clientIds
},
$inc: {"aggregate.seenCount": 1},
$set: {
"headers": req.myt.headers,
"ip": req.myt.ip
},
$setOnInsert: {
'_id': req.myt._id,
'derived': req.myt.derived
}
},
{upsert: true},
function (err, savedId) {
if (err || !savedId) console.log("failed to save :" + req.myt + " because of " + err);
else console.log("successfully saved :" + req.myt);
});
用一个简单的函数包装它,如:
function mongoInsert(req) {
//same query as above
}
然后使用:
调用它 mongoInsert(req);
在分析时我没有看到对速度的任何影响。我是否应该在包装函数中添加回调,是否需要?我期待它会产生一些性能影响,需要以不同的方式完成。
所以有几个问题。
调用mongoInsert()的方法是否会被同步调用并阻塞,直到async mongo更新完成为止?
如果确实变得同步,我会发现性能影响我没看到。我采用的方法是否可以使用?
如果不是这样做的正确方法是什么?
答案 0 :(得分:1)
mongoInsert()
仍然是异步的,因为它调用异步函数(mongo.myt.update()
)。即使你没有添加回调函数,它也不会神奇地变成同步。
您现在编写的方式是"即发即忘" :您的代码中某处调用mongoInsert()
,您的代码将继续运行更新正在进行,因为您没有通过回调,调用代码无法获得有关更新结果的信息(现在,您只是将结果记录到控制台)。
这是否是可以接受的设计决定。
您可以在需要了解更新结果的情况下选择回调:
function mongoInsert(req, callback) {
callback = callback || function() {}; // dummy callback when none is provided
mongo.myt.update(..., function(err, savedId) {
...log status here...
callback(err, savedId);
});
}