如何在不使用“_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 条评论
登录 后参与评论

相关文章