【问题标题】:MongoDB find document if exist - update else - insertMongoDB 查找文档(如果存在) - 更新其他 - 插入
【发布时间】:2014-05-31 21:06:37
【问题描述】:

我在使用 mongodb 时遇到了一些问题。 我的代码:

            for(var j = 0; j < arrayOfWords.length; ++j) {
              var word = arrayOfWords[j];
              (function(word) {
                if (word.length > 2) {
                  async.waterfall([
                      function(callback) {
                        collection.find({'word': word}).limit(1).toArray(function(err, data) {
                          log.info('find');
                          callback(err, data[0]);
                        })
                      },
                      function(data, callback) {
                        if (typeof data != 'undefined') {
                          log.info('Word found: ' + data);
                          unigramCollection.update({'word': word}, {'$inc' : {'sequence': 1}}, function(err, result) {
                            callback(err, result);
                          });
                        } else {
                          collection.insert({'word': word, 'sequence': 1}, function(err, result) {
                            log.info('Insert done!' + JSON.stringify(result));
                            callback(err, result);
                          })
                        }
                      }
                    ],
                  function(err, result) {
                    if(err) {
                      log.error('error: ' + err);
                    } else {
                      log.info('done!');
                    }
                  });
                }
              })(word);
            }

我不明白为什么,但是 mongoDB 起初会做所有的发现,然后是其他的。 控制台:

2014-05-31T12:27:03.112Z - info: [socket/projects.js] find
2014-05-31T12:27:03.113Z - info: [socket/projects.js] find
2014-05-31T12:27:03.113Z - info: [socket/projects.js] find
2014-05-31T12:27:03.116Z - info: [socket/projects.js] Insert done![{"word":"fhhghg","sequence":1,"_id":"5389ca979a49694e2c7ac7d2"}]
2014-05-31T12:27:03.116Z - info: [socket/projects.js] done!
2014-05-31T12:27:03.117Z - info: [socket/projects.js] Insert done![{"word":"dtrtr","sequence":1,"_id":"5389ca979a49694e2c7ac7d3"}]
2014-05-31T12:27:03.117Z - info: [socket/projects.js] done!
2014-05-31T12:27:03.117Z - info: [socket/projects.js] Insert done![{"word":"jgf","sequence":1,"_id":"5389ca979a49694e2c7ac7d4"}]
2014-05-31T12:27:03.118Z - info: [socket/projects.js] done!

如何才能以必要的顺序执行操作:查找,如果文档存在,则更新此文档,否则插入新文档

【问题讨论】:

    标签: javascript node.js mongodb asynchronous


    【解决方案1】:

    您可以使用 mongodb upsert 来完成整个操作,而不是对每个单词进行多次操作;

    db.test.update({'word':word}, {'$inc':{'sequence':1}}, {'upsert':true})
    

    这将在单个操作中更新现有单词,如果它不存在,则将其插入序列 1。

    【讨论】:

    • 还有一个问题,如果作品数组很大,我可以使用批量操作吗?
    猜你喜欢
    • 2020-09-08
    • 2021-12-20
    • 1970-01-01
    • 2011-04-07
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    相关资源
    最近更新 更多