我是JavaScript的新手,最终围绕异步编程。所以,虽然我可以告诉我为什么会遇到这个问题,但我似乎无法找到解决办法...
我有一系列字符串... [" a"," b"," c"," a"] 我试图以{word:count}
格式将它添加到mongo数据库中array.forEach(callback)
function callback(w) {
collection.find({"word":w}).toArray(function(err, result) {
if (result.length == 0) {
//This means it's a new word
collection.insert({"word":w, "count":1}, function(err, res) {});
} else if (result.length == 1) {
//Word already exists in database
collection.update(....)
}
});
}
但每次都插入一个新单词,计数永远不会更新。 它正在发生,因为它实现了异步方式。
理想情况下,我想说一句话,检查它是否存在,插入/更新然后查看下一个单词。 但我不知道该怎么做。
我真的不希望这样做"同步",只是这个想法是相似的
答案 0 :(得分:1)
您想要"upserts"。这基本上是一个"发现或创造"在一次手术中。您还需要一种处理"循环的方法。以尊重"写"的回调响应的方式循环前的操作。但是,使用" Bulk"处理它可能是合理的。操作,使实际"写"和#34;回应"只发生一次:
collection.bulkWrite(
array.map(function(w) {
return {
"updateOne": {
"filter": { "word": w },
"update": {
"$inc": { "count": 1 }
},
"upsert": true
}
}
}),
function(err,result) {
// result contains BulkWriteResponse
}
)
$inc
运算符处理实际的增量,因为这是" upsert",如果没有找到匹配文档" filter"然后创建一个新文档。否则,现有的更新并且"递增"。
在一个更大的"理想情况下,您可以从"流"并建立合理的规模"批次" "散装" .bulkWrite()
的操作。但是,如果你只有一个合理大小的数组,那么单个" in-line"上下文如图所示。
唯一的事情是" async"这是实际的.bulkWrite()
调用,因此在此上下文中只有一个点,您需要等待响应,而不是等待每个单独的操作。
还有其他方法可以尊重"回调"每个"写"在"异步循环"中,但对于这个特定的上下文,它可能最适合由单个.bulkWrite()
调用处理,使用"批处理" " upsert"指令。