【发布时间】:2021-03-19 14:49:00
【问题描述】:
我有一个表来存储用户的记录。
{
"_id" : "",
"Username" : "",
"Points" : 0,
"CompletedAchievements" : {
"Public": [],
"Private": []
},
"ActiveAchievements" : {
"Public": [],
"Private": []
},
"Kudos" : [],
"Teams" : [],
"UserType" : "Admin",
"PrivateAchievements": []
}
我的 C# 代码
public void Add<T>(string userId, string achievementId, int progress) {
var collection = this.db.GetCollection<T>(typeof(T).Name);
var filter = Builders<T>.Filter.And(
Builders<T>.Filter.Eq("_id", userId),
Builders<T>.Filter.Eq("ActiveAchievements.Public", "Public"));
var update = Builders<T>.Update.Push("ActiveAchievements.$.Public", new
ActiveAchievement() { _id = achievementId, Progress = progress });
collection.FindOneAndUpdateAsync(filter, update);
}
我正在尝试在活动成就中为公共数组添加一个值。有谁知道为什么这不起作用?
【问题讨论】:
-
我看到的一个问题是
"ActiveAchievements.$.Public"在update变量中的用法。Public是ActiveSchievements子文档中的一个字段 - 在指定字段路径以向数组Public添加元素时,您不需要使用$.。以下是正确的方式"ActiveAchievements.Public" -
另外,过滤器
Builders<T>.Filter.Eq("ActiveAchievements.Public", "Public")的目的是什么? -
我对第二个过滤器的推理是我需要第一个过滤器来获取记录,然后需要另一个过滤器来获取 ActiveAchievements 数组,但我想我可以去 ActiveAchievements.Public 并在我之后直接推送到它使用第一个过滤器获得记录了吗?
-
您不需要数组字段上的过滤器除非您想在数组内部搜索某些东西(这不是您的本意案例)。
-
现在整理好了,只需要一个过滤器并去掉美元符号
标签: c# arrays mongodb mongodb-query mongodb-.net-driver