【问题标题】:Adding Batch Upsert to MongoDB.向 MongoDB 添加批量更新插入。
【发布时间】:2012-01-14 01:57:26
【问题描述】:

看来 MonogoDB 不支持批量更新插入。它是否正确?

如果没有,您将如何使用最有效的现有 API 添加批量更新插入?批量 upsert 甚至对 mongo db 有意义吗?

【问题讨论】:

  • “批量更新插入”到底是什么意思?添加尚不存在的文档,同时更新(替换)已存在的对象?
  • 是的,但作为一批而不是一个接一个!类似于为一个文档执行 upsert 的 save 方法,但它可以为一批文档执行批量 upsert
  • 本帖是否为您提供帮助:stackoverflow.com/questions/5143756/…
  • @MSpreij 这个问题已经存在一年了,OP (iCode) 似乎已经满意“保存”方法对他们的工作流程最有意义。您想详细说明您的用例吗?

标签: mongodb


【解决方案1】:

如果您升级到 MongoDB 2.6,您可以利用 new Bulk operations

Bulk.find(<query>).upsert().update(<update>);
Bulk.find(<query>).upsert().updateOne(<update>);
Bulk.find(<query>).upsert().replaceOne(<replacement>);    

【讨论】:

    【解决方案2】:

    有一个名为 mongoimport 的实用程序,它有一个 upsert 标志。类似的东西

    mongoimport -c myitems -d mydb --upsert items.json
    

    这可能实现您想要的吗?

    默认是根据 _id 进行更新插入,但您可以使用此处记录的 --upsertFields 标志进行更改

    http://docs.mongodb.org/manual/reference/mongoimport/#cmdoption-mongoimport--upsertFields

    【讨论】:

      【解决方案3】:

      对于 C# MongoDB.Driver,我使用下一个:

              var writeModels = new List<WriteModel<T>>();
              foreach (var entity in list)
              {
                  var id = entity.Id;
                  if (id == null)
                  {
                      writeModels.Add(new InsertOneModel<T>(entity));
                  }
                  else
                  {
                      var filter = new ExpressionFilterDefinition<T>(x => x.Id == id);
                      var replaceModel = new ReplaceOneModel<T>(filter, entity);
                      writeModels.Add(replaceModel);
                  }
              }
              await getCollection().BulkWriteAsync(writeModels);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多