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

时间:2016-04-13 00:32:25

标签: javascript node.js mongodb mongodb-query

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

但每次都插入一个新单词,计数永远不会更新。 它正在发生,因为它实现了异步方式。

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

我真的不希望这样做"同步",只是这个想法是相似的

1 个答案:

答案 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"指令。