为什么会发生
因为在某些情况下,upsert不能自动生成_id 对于你正在操纵的对象。
解决方案A
在模型的_id字段中使用[BsonIgnoreIfDefault]。
解决方案B
您可以在使用之前手动生成_id ObjectId.GenerateNewId()
更多信息
原始帖子
在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
答案 0 :(得分:1)
您的AppModel的ID记录值看起来有问题。看起来他们丢失了或者所有'000000000000000000000000'