[英]How can I force a Mongoose Save() call to be synchronous
我在Node.js中編寫一個腳本,需要執行以下操作:
我已經看了一段時間並得出結論,使用異步mongodb幾乎不可能做到這一點。 問題是多方面的,但是例如,如果您正在處理20,000個這樣的節點,那么執行異步將掛起腳本。 但是,由於步驟4需要查看對象是否已存在,因此將它們作為批量插入進行操作是不可行的。
有可能將一些可怕的東西拼湊在一起,緩存創建的對象,然后將它們保存為類似第7步的東西,除非它很難,因為對象進入了多個集合,你需要嘗試查找對象首先從緩存,然后是數據庫,在步驟4.如果這是解決方案,那么我將把Javascript注銷為破壞,並在perl中寫入。 所以我的問題是,對於像上面這些動作一樣簡單的事情,我能以某種方式強迫 mongodb同步,以便我的腳本不會變成瘋狂嗎? 我希望能夠說document.save()(順便說一下我使用的是Mongoose),然后讓它在實際保存后才返回。
編輯:添加代碼
這從循環中調用大約20000次。 我不關心(在合理范圍內)需要多長時間,但200,000異步調用保存會掛起腳本,因此不能那樣(它在那時也使用超過1.5gig的ram)。 如果我不能做hObj.save(); 等到對象實際保存,然后我需要用更有能力的語言寫這個。
models('hs').findOne({name: r2.$.name}, function (err, h) {
if (err) {
console.log(err);
} else {
var resultObj = createResult(meeting, r1, r2);
if (h == undefined) {
var hObj = new models('hs')({
name : r2.$.name,
results : [resultObj],
numResults : 1
});
hObj.save();
} else {
h.results.push(resultObj);
h.numResults++;
h.save();
}
}
});
從異步github頁面:
eachSeries (arr,iterator,callback)
與每個相同,只有迭代器應用於arr中的每個項目。 只有當前的迭代器完成后才會調用下一個迭代器。 這意味着迭代器函數將按順序完成。
假設您在節點中擁有XML 節點
async.eachSeries(
nodes,
// This will be applied to every node in nodes
function (node, callback) {
models('hs').findOne({name: r2.$.name}, function (err, h) {
if (err) {
console.log(err);
} else {
// Async?
var resultObj = createResult(meeting, r1, r2);
if (h == undefined) {
var hObj = new models('hs')({
name : r2.$.name,
results : [resultObj],
numResults : 1
});
hObj.save(function (err, p) {
// Callback will tell async that you are done
callback();
});
} else {
h.results.push(resultObj);
h.numResults++;
h.save(function (err, p) {
// Callback will tell async that you are done
callback();
});
}
}
});
},
// This will be executed when all nodes has been processed
function (err) {
console.log('done!');
}
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.