c# - 使用 ReplaceOne 执行 Upsert,但如果记录存在则递增其中一个字段
问题描述
我正在我的收藏中进行更新,但如果该项目已经在收藏中,我还想增加一个计数器。
我有这个:
var user = new User(...);
users.ReplaceOne<User>(
u => u.Id == user.Id,
user,
new ReplaceOptions { IsUpsert = true }
);
假设用户对象有一个像“LikeCount”这样的字段。如果记录存在,我想增加这个值,这可以通过 upsert 实现吗?
解决方案
您可以使用该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});
推荐阅读
- python - 以 csv 格式下载 google bigquery 数据
- javascript - 如何通过使用 setInterval 方法调用函数来打印时钟的指针
- python - 如何从 CLI 安装和运行 Pyright 而不是使用 VS Code?
- ruby-on-rails - 重命名涉及属于关联 id 的强参数
- sql - 从 Oracle 中的日期获取季度的问题
- google-cloud-platform - GKE 堆栈驱动程序跟踪报告按集群按环境按服务按服务版本
- java - 当用户输入不正确时,我将如何做到这一点,以便 while/else 语句正确地重复自身?
- javascript - 如何在 Electron 中正确加载 lit-html 模块
- text-to-speech - Google Cloud 文字转语音单词时间戳
- python - 什么是实时更新 SQL Server 的好方法?