【问题标题】:Insert or update multiple documents in MongoDB在 MongoDB 中插入或更新多个文档
【发布时间】:2018-04-05 07:59:29
【问题描述】:

我想实现带有 NodeJS 和 MongoDB 支持的主题标签功能,这样我也可以计算使用情况。每当用户向页面添加主题标签时,我都想在数据库中推送或更新它们。每个标签看起来像这样:

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

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

选项 1

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

选项 2

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

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

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

问题

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

【问题讨论】:

  • 您当前的 mongodb 3.x 版本是什么?
  • 是的,3.x。忘了说,抱歉

标签: node.js mongodb


【解决方案1】:

你应该做这样的事情,所有这些都将在一个批次中执行,这只是一个 sn-p 的想法:

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

【讨论】:

  • 似乎可以在控制台上工作,现在的问题是它不能在 mongoskin 上工作:D。无论如何,这是原始问题的答案..
【解决方案2】:

我会使用 Mongodb 从 2.6 版本开始提供的Bulk method。同样,您可以在标签是新标签时执行插入操作,并在它已经存在时更新计数器。

【讨论】:

  • "您请求的 URL 不存在或已被删除。"我看到了一个 Bulk 的例子,但不知道如何让它适应我目前的情况。这将以编程方式发生,这不是我需要从控制台执行的操作。
  • 你说的没错,网址有误,我修好了。无论如何,moliman 的回答是正确和完整的。问候。
猜你喜欢
  • 2017-03-07
  • 2020-09-05
  • 2015-01-14
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2019-09-19
  • 2014-09-08
  • 1970-01-01
相关资源
最近更新 更多