首页 > 解决方案 > 使用 ReplaceOne 执行 Upsert,但如果记录存在则递增其中一个字段

问题描述

我正在我的收藏中进行更新,但如果该项目已经在收藏中,我还想增加一个计数器。

我有这个:

var user = new User(...);
users.ReplaceOne<User>(
  u => u.Id == user.Id,
  user,
  new ReplaceOptions { IsUpsert = true }
);

假设用户对象有一个像“LikeCount”这样的字段。如果记录存在,我想增加这个值,这可以通过 upsert 实现吗?

标签: c#mongodb

解决方案


您可以使用该UpdateOne方法并传入,Upsert=true但在更新中您可以使用SetOnInsert.

class User
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public int Counter { get; set; }
}

var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<User>("users");

var user = new User {Name = "My User", Age = 30};
var id = new ObjectId("507f1f77bcf86cd799439011");
var filter = Builders<User>.Filter.Eq(x => x.Id, id);
var update = Builders<User>.Update.Inc(x => x.Counter, 1)
    .SetOnInsert(u => u.Name, user.Name)
    .SetOnInsert(u => u.Age, user.Age);

await collection.UpdateOneAsync(filter, update, new UpdateOptions{IsUpsert = true});

推荐阅读