在MongoDB中插入或更新多个文档

时间:2017-10-24 13:32:51

标签: node.js mongodb

我想用NodeJS和MongoDB支持实现hashtags功能,这样我也可以计算用途。每当用户向页面添加主题标签时,我想在数据库中推送或更新它们。每个hastag都是这样的:

{_id:<auto>, name:'hashtag_name', uses: 0}

我面临的问题是用户也可以添加新标签,因此当他点击“完成”时,我必须增加现有标签的“使用”字段,然后添加新标签。诀窍是如何只用一条Mongo指令做到这一点?到目前为止,我想到了实现这一目标的两种可能方法,但我对其中任何一种都不满意:

选项1

我有一个服务,在用户开始编写新文章之前从db中获取现有标签。基于此,我可以检测哪些标签是新的,并运行2个查询:一个将添加新标签,另一个将更新现有标签

选项2

我会将标签列表发送到服务器,然后我会为每个标签运行一个find();如果我找到一个,我会更新,如果没有,我会创建它。

选项3 (暂时没有解决方案)

最好的选择是运行一个带有一组标签名称的查询,对现有标签进行$ inc操作,然后添加缺少的那些。

问题

有更好的解决方案吗?我可以从选项#3获得最终结果吗?

2 个答案:

答案 0 :(得分:2)

你应该做这样的事情,所有这些都将在一批中执行,这只是一个片段的想法如何做到:

var db = new Db('DBName', new Server('localhost', 27017));
    // Establish connection to db
    db.open(function(err, db) {
    // Get the collection
    var col = db.collection('myCollection');

    var batch = col.initializeUnorderedBulkOp();

    for (var tag in hashTagList){
      // Add all tags to be executed (inserted or updated) 
      batch.find({_id:tag.id}).upsert().updateOne({$inc: {uses:1}});
    }

    batch.execute(function(err, result) {
      db.close();
    });
  });

答案 1 :(得分:0)

我会使用自2.6版以来Mongodb提供的Bulk method。同样,当标签是新的时,你可以执行插入操作,当它已经存在时,计数器会更新。