簡體   English   中英

如何使用MongoDB c#驅動程序替換整個陣列

[英]how to replace the entire array using MongoDB c# driver

說,DB中的現有文檔是這樣的:

{
  "_id": "1",
  "settings": {
     "languages": [ "english", "french" ]
  }
}

現在,我想將文檔更新為:

{
  "_id": "1",
  "settings": {
     "languages": [ "korean", "german" ]
  }
}

我厭倦了以下代碼:

var lan = new List<string> { "finish", "russian", "korean" }   
collection.UpdateOne(
Builders<MyObject>.Filter.Eq("_id", "1"), 
Builders<MyObject>.Update.Set("settings.languages", lan));

但是出現以下異常:

MongoDB.Bson.Serialization.Serializers.EnumerableInterfaceImplementerSerializer 2[System.Collections.Generic.List 1 [System.String],System.String]'無法轉換為類型'MongoDB.Bson.Serialization.IBsonSerializer`1 [System.String]

我還嘗試使用BsonArray初始化新的語言數組:

var bsonArray = new BsonArray
{
    "korean",
    "german"
};

collection.UpdateOne(
Builders<MyObject>.Filter.Eq("_id", "1"), 
Builders<MyObject>.Update.Set("settings.languages", bsonArray));

可以正確執行更新,但是文檔中的語言更改為:

{
  "_id": "1",
  "settings": {
     "languages": "[korean, german]"
  }
}

它變為"[ xx, xx ]" ,而不是[ "xx", "xx" ] 這不是我所期望的。

之所以收到該錯誤消息,是因為您在類型MyObject上使用強類型生成器,該類型可能看起來或多或少如下所示:

public class MyObject
{
    public string _id { get; set; }
    public Settings settings { get; set; }
}

public class Settings
{
    public string[] languages { get; set; }
}

因此,由於您擁有一個強類型化的Builder因此由於ListArray之間的類型不匹配而導致了異常。 解決該問題的兩種方法:

使用列表中的.ToArray()來獲得與MyObject相同的類型:

var lan = new List<string> { "finish", "russian", "korean" };
collection.UpdateOne(
    Builders<MyObject2>.Filter.Eq("_id", "1"),
    Builders<MyObject2>.Update.Set("settings.languages", lan.ToArray()));

或跳過使用BsonDocument類的類型驗證:

var collection = mydb.GetCollection<BsonDocument>("col");
var lan = new List<string> { "finish", "russian", "korean" };
collection.UpdateOne(
    Builders<BsonDocument>.Filter.Eq("_id", "1"),
    Builders<BsonDocument>.Update.Set("settings.languages", lan));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM