gpt4 book ai didi

javascript - 项目数组的同步插入或增量

转载 作者:行者123 更新时间:2023-12-03 07:12:14 25 4
gpt4 key购买 nike

我是 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(....)
}
});
}

但是每次都会插入一个新单词,计数永远不会更新。发生这种情况是因为它的实现方式是异步的。

理想情况下,我想取出一个单词,检查它是否存在,插入/更新,然后查看下一个单词。但我不知道该怎么做。

我并不是真的希望“同步”做到这一点,只是想法相似

最佳答案

你想要"upserts"反而。这基本上是一次操作中的“查找或创建”。您还需要一种处理“循环”的方法,以尊重循环之前“写入”操作的回调响应。但用“批量”操作来处理它可能是合理的,这样实际的“写入”和“响应”只发生一次:

collection.bulkWrite(
array.map(function(w) {
return {
"updateOne": {
"filter": { "word": w },
"update": {
"$inc": { "count": 1 }
},
"upsert": true
}
}
}),
function(err,result) {
// result contains BulkWriteResponse
}
)

$inc运算符处理实际增量,并且由于这是“更新插入”,因此如果没有找到与“过滤器”匹配的文档,则会创建一个新文档。否则,现有的将被更新并“增加”。

在“更大”的上下文中,您最好从“流”中读取内容,并为.bulkWrite()构建合理大小的“批量”“批量”操作。 。但是,如果您已经有一个合理大小的数组,那么如图所示的单个“内联”上下文就没有问题。

这里唯一“异步”的是实际的 .bulkWrite()调用,因此在这种情况下,只有一个点需要等待响应,而不是等待每个单独的操作。

还有其他方法可以尊重“异步循环”中每个“写入”的“回调”,但对于此特定上下文,它可能最适合由单个 .bulkWrite() 处理。调用,并带有“批量”“upsert”指令。

关于javascript - 项目数组的同步插入或增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com