【问题标题】:C# MongoDB bulk Upsert - A bulk write operation resulted in one or more errorsC# MongoDB bulk Upsert - 批量写入操作导致一个或多个错误
【发布时间】:2015-12-13 17:28:44
【问题描述】:

为什么会发生

因为在某些情况下 upsert 不能自动生成 _id 对于您正在操作的对象。

解决方案 A

在模型的 _id 字段中使用 [BsonIgnoreIfDefault]。

解决方案 B

您可以在使用 upsert 之前手动生成 _id ObjectId.GenerateNewId()

更多信息

Herehere

原帖

按照official documentation,我写了这个方法。当我运行它时,我收到这条神秘的错误消息:“批量写入操作导致一个或多个错误”。知道是什么原因造成的吗?一切看起来都很好。我已经有批量插入和删除方法正常工作。

public bool BulkUpsertReplaceOne (List<AppModel> records,
                                  string collectionName)
{
    try
    {
        var bulk = _database.
                   GetCollection(collectionName).
                   InitializeUnorderedBulkOperation();

        foreach(AppModel am in records)
        {
            IMongoQuery mongoQuery = Query.EQ ("Url", am.Url);
            bulk.Find (mongoQuery).Upsert().ReplaceOne(am);
        }
        bulk.Execute();
        return true;
    }
    catch(Exception e)
    {
        logger.Info (e.Message);
    }
}

编辑完成错误

at MongoDB.Driver.Operations.BulkWriteBatchResultCombiner.CreateResultOrThrowIfHasErrors (IEnumerable`1 remainingRequests) in <filename unknown>:line 0
at MongoDB.Driver.Operations.BulkMixedWriteOperation.Execute (MongoDB.Driver.Internal.MongoConnection connection) in <filename unknown>:line 0
at MongoDB.Driver.MongoCollection.BulkWrite (MongoDB.Driver.BulkWriteArgs args) in <filename unknown>:line 0
at MongoDB.Driver.BulkWriteOperation.ExecuteHelper (MongoDB.Driver.WriteConcern writeConcern) in <filename unknown>:line 0
at MongoDB.Driver.BulkWriteOperation.Execute () in <filename unknown>:line 0
at SharedLibrary.Wrappers.MongoDB.MongoDBWrapper.BulkUpsertReplaceOne (System.Collections.Generic.List`1 records, System.String collectionName) in <filename unknown>:line 0"

EDIT2

我不知道这是否相关,但是如果我在错误后检查数据库,只插入了一项批量更新,并且hasObjectId(“000000000000000000000000”)。

版本:MongoDB 2.6.1,MongoC# 驱动程序 2.0.1

【问题讨论】:

  • 看批量.Execute()手动定义。它应该返回一个包含写入操作结果的详细对象,包括错误。请注意,较新的驱动程序已经改变了行为,因为如果发生任何错误,无序操作现在会抛出异常,即使将应用完整的批处理,当然也会报告任何错误。在以前的版本中,情况并非始终如一,错误被记录但不是例外。
  • e.message 显示“批量写入操作导致一个或多个错误”。此外,我无法访问 .Execute() 的结果,因为它被错误中断。我用 e 的完整信息更新了帖子。
  • 你能不能只更新一条记录而不是全部,只是为了测试其中一条记录是否有坏数据,或者Execute方法有问题。
  • 好吧,肯定是id问题。这很奇怪,因为我的批量插入和批量删除方法没有发生这个问题。我将用解决方案更新帖子。
  • 您的 AppModel 记录中有有效的 id 吗?

标签: c# .net mongodb mongodb-.net-driver database


【解决方案1】:

您的 AppModel 的 id 记录值似乎有问题。看起来他们不见了或全是'000000000000000000000000'

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 2020-07-05
    • 2021-07-29
    • 2021-01-07
    相关资源
    最近更新 更多