【问题标题】:MongoDb update nested array itemMongoDb 更新嵌套数组项
【发布时间】:2020-10-22 18:56:00
【问题描述】:

我有以下数据库结构。

{
  "classes": [
    {
      "_id": "abcd1234",
      "classname": "11/A",
      "students": [
        {
          "_id": "student1",
          "firstname": "Don",
          "lastname": "Joe"
        },
        {
          "_id": "student2",
          "firstname": "Doo",
          "lastname": "Joe"
        },
        ...
      ]
    },
    ...
  ]
}

如何通过C# MongoDb Driver 的ID 更新学生? 像这样的:

public async Task UpdateStudent(string studentId, Student student)
{
    // implementation???
}

【问题讨论】:

  • 所以你想更新一个嵌套数组项,它本身就存在于一个嵌套数组中?还是classes 应该代表收藏?
  • classes 是集合本身。

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


【解决方案1】:

您可以使用 MongoDB 位置运算符 ($),它在 C# 中只是数组中 -1 的索引。

var filter = Builders<Class>.Filter.ElemMatch(x => x.Students, Builders<Student>.Filter.Eq(x => x.Id, "student2"));
var update = Builders<Class>.Update.Set(x => x.Students[-1].Firstname, "NEW FIRST NAME")
                                    .Set(x => x.Students[-1].Lastname, "NEW LAST NAME");

await collection.UpdateOneAsync(filter, update);

public class Class
{
    public string Id { get; set; }
    public string Classname { get; set; }
    public Student[] Students { get; set; }
}

public class Student
{
    public string Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
}

例如,如果您将一些文档推送到我们的集合中,如下所示

var client = new MongoClient();
var db = client.GetDatabase("test");
var collection = db.GetCollection<Class>("classes");

await collection.InsertManyAsync(new[]
{
    new Class
    {
        Id= Guid.NewGuid().ToString(),Classname = "Class 1", Students = new Student[]
        {
            new Student{Id = "student1", Firstname = "Don", Lastname = "Joe"},
            new Student{Id = "student2", Firstname = "Doo", Lastname = "Joe"}
        }
    },
    new Class
    {
        Id= Guid.NewGuid().ToString(),Classname = "Class 1", Students = new Student[]
        {
            new Student{Id = "student3", Firstname = "Don2", Lastname = "Joe2"},
            new Student{Id = "student4", Firstname = "Doo2", Lastname = "Joe2"}
        }
    }
});

如果我们运行上述更新,我们的数据在 shell 中将如下所示

> db.classes.find().pretty()
{
        "_id" : "b0413433-199a-4df0-bef0-0c6ae13e08b9",
        "Classname" : "Class 1",
        "Students" : [
                {
                        "_id" : "student1",
                        "Firstname" : "Don",
                        "Lastname" : "Joe"
                },
                {
                        "_id" : "student2",
                        "Firstname" : "NEW FIRST NAME",
                        "Lastname" : "NEW LAST NAME"
                }
        ]
}
{
        "_id" : "b88c2725-3046-4717-96f2-e0553a5d3c96",
        "Classname" : "Class 1",
        "Students" : [
                {
                        "_id" : "student3",
                        "Firstname" : "Don2",
                        "Lastname" : "Joe2"
                },
                {
                        "_id" : "student4",
                        "Firstname" : "Doo2",
                        "Lastname" : "Joe2"
                }
        ]
}
>

查看以下帖子:https://kevsoft.net/2020/03/23/updating-arrays-in-mongodb-with-csharp.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2019-12-07
    • 1970-01-01
    • 2018-10-22
    • 2019-06-08
    相关资源
    最近更新 更多