【发布时间】:2015-12-13 17:28:44
【问题描述】:
为什么会发生
因为在某些情况下 upsert 不能自动生成 _id 对于您正在操作的对象。
解决方案 A
在模型的 _id 字段中使用 [BsonIgnoreIfDefault]。
解决方案 B
您可以在使用 upsert 之前手动生成 _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);
}
}
编辑完成错误
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