如何将元素推入 mongodb .net 驱动程序中的数组

Sha*_*awn 5 c# mongodb mongodb-.net-driver

我的数据如下所示

> db.people.findOne({"Name":"Jones"})
{
        "_id" : ObjectId("551dcbdc360fbd77107f8a37"),
        "Name" : "Jones",
        "Age" : 30,
        "Profession" : "Hacker"
}
Run Code Online (Sandbox Code Playgroud)

类定义为

class Person
{
  public ObjectId Id { get; set; }
  public string Name { get; set; }
  public int Age { get; set; }
  public List<string> Colors { get; set; }
  public List<Pet> Pets { get; set; }
}

class Pet
{
  public string Name { get; set; }
  public string Type { get; set; }
} 
Run Code Online (Sandbox Code Playgroud)

我尝试将 Pet 元素推入 Pets 字段

  var pet = new Pet
  {
    Name = "Boneless",
    Type = "Gold Fish",
  };

  var result = await coll_t.UpdateOneAsync(Builders<Person>.Filter.Eq("Name", "Jones"), Builders<Person>.Update.Push(x => x.Pets, pet)); 

  Console.WriteLine(string.Format("MatchedCount = {0}; ModifiedCount = {1}; UpsertedId = '{2}';"), result.MatchedCount.ToString(), result.ModifiedCount.ToString(), result.UpsertedId.ToString());
Run Code Online (Sandbox Code Playgroud)

更新没有报错。但它没有更新。结果中的MatchedCount是0,ModifiedCount也是0。我错过了什么?

谢谢,

附言。Console.WriteLine(....) 没有显示任何内容,看起来像是遇到了未捕获的错误。任何想法?

kir*_*son 5

如果 MatchedCount 为 0,则表示未找到该记录。col_t 正确吗?您正在使用正确的数据库和集合吗?

尝试根据您的密钥而不是名称进行更新。用这个替换你的过滤器:

Builders<Person>.Filter.Eq("_id", new ObjectId("551dcbdc360fbd77107f8a37"))
Run Code Online (Sandbox Code Playgroud)

另外,我会在 Person 中初始化您的 Pets 集合,这样当您没有 Pets 时,您的数据库就知道它是一个空集合。

public Person()
{
    Pets = new List<Pet>();
}
Run Code Online (Sandbox Code Playgroud)