【问题标题】:Insert new record to array on object on a record MongoDB C#将新记录插入到记录MongoDB C#上的对象上的数组中
【发布时间】: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 变量中的用法。 PublicActiveSchievements 子文档中的一个字段 - 在指定字段路径以向数组 Public 添加元素时,您不需要使用 $.。以下是正确的方式"ActiveAchievements.Public"
  • 另外,过滤器Builders&lt;T&gt;.Filter.Eq("ActiveAchievements.Public", "Public")的目的是什么?
  • 我对第二个过滤器的推理是我需要第一个过滤器来获取记录,然后需要另一个过滤器来获取 ActiveAchievements 数组,但我想我可以去 ActiveAchievements.Public 并在我之后直接推送到它使用第一个过滤器获得记录了吗?
  • 您不需要数组字段上的过滤器除非您想在数组内部搜索某些东西(这不是您的本意案例)。
  • 现在整理好了,只需要一个过滤器并去掉美元符号

标签: c# arrays mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

最后是一个简单的修复。 只有 1 个过滤器需要 _id 过滤器来获取记录。


var filter = Builders<T>Filter.Eq("_id", userId);

一旦我有了它,我就可以对对象上的数组进行以下更新。

var update = Builders<T>.Update.Push("ActiveAchievements.Public", new 
        ActiveAchievement() { _id = achievementId, Progress = progress });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2016-04-04
    相关资源
    最近更新 更多