C#MongoDB批量Upsert - 批量写入操作导致一个或多个错误

时间:2015-09-16 23:15:24

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

  

为什么会发生

     

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

     

解决方案A

     

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

     

解决方案B

     

您可以在使用之前手动生成_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);
    }
}

编辑 COMPLETE ERROR

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

我不知道这是否相关,但如果我在错误后检查数据库,则只插入了一个批量upsert项,并且hasObjectId(&#34; 000000000000000000000000&#34;)。 / p>

版本:MongoDB 2.6.1,MongoC#driver 2.0.1

1 个答案:

答案 0 :(得分:1)

您的AppModel的ID记录值看起来有问题。看起来他们丢失了或者所有'000000000000000000000000'