如何在不使用“_id”键的情况下使用 c# 在 MongoDB 中避免重复插入?

氪456

我有一个数据,比如文档中的 5 个字段,假设这 3 个字段这 3 个字段唯一有助于识别文档。

Name:A, Type: B, Contact: C

我想避免这些字段在文档中重复输入(插入)。我现在正在使用下面的代码

_mongoCollection.GetCollection<ModelClass>('collectionName').Find(s => s.Name==A && s.Type==B && s.Contact==C).FirstORDefault();

如果结果为空;我们插入使用:

_mongoCollection.getCollection<BsonDocument>('collectionName');

然后使用 InsertOne 插入。有没有更好的方法来实现这一点并避免重复?

马库斯

您可以为此使用 Upsert:

var coll = _mongoCollection.getCollection<ModelClass>("collectionName");
var model = new ModelClass() 
{
  Name = A, 
  Type = B, 
  Contact = C, 
  Field4 = "F4", 
  Field5 = "F5",
};
await coll.ReplaceOneAsync(s => s.Name == model.Name 
  && s.Type == model.Type 
  && s.Contact == model.Contact, 
  model, 
  new ReplaceOptions() { IsUpsert = true });

上面的代码检查是否存在匹配的文档;如果是,则替换它,否则插入一个新文档。ReplaceOne如果您的方法不是asyncUpdateOne(Async)对现有文档进行更细粒度的更新,您也可以使用。

更新插入

例如,如果您只想在没有文档的情况下插入新文档,则可以使用以下不替换文档的 upsert:

var coll = _mongoCollection.getCollection<ModelClass>("collectionName");
var model = new ModelClass() 
{
  Name = A, 
  Type = B, 
  Contact = C, 
  Field4 = "F4", 
  Field5 = "F5",
};
var update = Builders<ModelClass>.Update
  .SetOnInsert(x => x.Field4, model.Field4)
  .SetOnInsert(x => x.Field5, model.Field5);
var result = await coll.UpdateOneAsync(
  x => x.Name == model.Name && x.Type == model.Type && x.Contact == model.Contact, 
  update, 
  new UpdateOptions() { IsUpsert = true });

如果尚不存在,上述代码将创建一个新文档。如果插入了文档,您可以检查result.UpsertedId. 如果为null,则没有插入文档,否则包含插入文档的id。

SetOnInsert此更新仅对其余两个字段使用操作。如果文档已经存在,则保持不变。

批量更新插入

如果要使用批量操作执行多个 upsert,可以使用以下代码:

var update = Builders<ModelClass>.Update
    .SetOnInsert(x => x.Field4, model.Field4)
    .SetOnInsert(x => x.Field5, model.Field5);
var bldr = Builders<ModelClass>.Filter;
var updates = new List<WriteModel<ModelClass>>();
var updateOneModel = new UpdateOneModel<ModelClass>(
    bldr.Eq(x => x.Name, model.Name) & bldr.Eq(x => x.Type, model.Type) & bldr.Eq(x => x.Contact, model.Contact), 
    update);
updateOneModel.IsUpsert = true;
updates.Add(updateOneModel);
// ... add additional UpdateModels
var result = await coll.BulkWriteAsync(updates);

在这种情况下,结果包含一个更新插入的 id 列表;还有一个Index属性,您可以使用它来找出哪些UpdateModels导致了 upsert,哪些没有。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Mongodb C ++避免重复

如何在C#中不使用Edmx的情况下使用DbContext?

如何在不使用to_string或stoi的情况下将int转换为C ++ 11中的字符串?

如何在不使用break的情况下退出C ++中的循环?

在子文档中不使用区分符的情况下将C#类序列化到MongoDB

如何在不使用memcmp的情况下比较c中的ipv6地址

如何在不使用字符的情况下使用termcap在C程序中获取光标位置?

如何在不使用C ++函数的情况下显示链接列表中的元素?

如何在Swift4中不使用Objective-C的情况下向标签添加动作

如何在不使用stat()的情况下检测到我在C中打开()了目录?

如何在c中不使用任何递归函数的情况下遍历目录?

如何在不使用GCC中的limit.h头文件的情况下编译C程序?

如何在不使用函数或类的情况下重复代码段以实现C ++中的高性能循环

如何在不使用幻数的情况下将“字符数”转换为int?(在C ++中)

如何在不使用gdb的情况下查找谁破坏了c(linux)中的堆栈?

如何在不使用数组的情况下计算C中的相同字符

C ++如何在不使用向量的情况下从数组中删除0个值

如何在不使用qt的情况下知道c ++中的unicode块?

如何在不使用C#手动更新ID的情况下将依赖LINQ插入SQL实体?

如何在不使用isdigit的情况下检查数字是否不是C中的整数?

如何在不使用 isalpha 的情况下验证 C 中的名称?

如何在不使用 json 的情况下解析 Qt C++ 中的数据?

如何避免在 MongoDB 中使用 db.insertMany() 在集合中插入重复值?

如何在不使用 C 中的数组的情况下读取给定的“n”输入?

c - 如何在不使用c中的关系运算符的情况下返回true或false?

如何在不使用 C# 中创建类的情况下解析此 json 结果

如何在不使用 Builders 的情况下使用 .net(c#) 驱动程序更新 mongo db 中的文档?

如何在 C 中不使用括号的情况下修改字符串文字的内容?

如何在不使用展开的情况下使用 mongodb 中的数组元素对数据进行排序