как заменить весь массив используя драйвер MongoDB c # - PullRequest
0 голосов
/ 04 декабря 2018

Скажем, существующий документ в БД выглядит так:

{
  "_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" ].Это не то, что я ожидал.

1 Ответ

0 голосов
/ 05 декабря 2018

Вы получаете это сообщение об ошибке, потому что вы используете строго типизированные компоновщики для типа MyObject, который, вероятно, выглядит более или менее так, как показано ниже:

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

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

Так как у вас строго типизированный Builder вы получаете исключение из-за несоответствия типов между List и Array.Два способа исправить это:

Либо используйте .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));
...