我有一个数据,比如文档中的 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
如果您的方法不是async
或UpdateOne(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] 删除。
我来说两句