Используя драйвер Mongo С#, как сериализовать массив пользовательского объекта, чтобы его сохранить?

У меня есть документ продукта, содержащий массив документов. Например

{
 id: 1,
 name: "J-E-L-L-O",
 store:[{id: 1,
    name: "Store X"},
    {id: 2,
    name: "Store Y"}]
}

Я хотел бы, например, изменить имя "Store Y" для сохранения Z. В то время я не знаю индекс объекта. Поэтому я вытягиваю весь массив, нахожу объект в обновить, изменить имя, а затем попытаться установить значение "store" с обновленным массивом.

productCollection.Update(query, Update.Set("store", storeList.ToBsonDocument()));

Однако я получаю сообщение об ошибке: "An Array value cannot be written to the root level of a BSON document."

Я думаю, мне просто нужно знать, как сериализовать массив настраиваемых объектов в массив BsonDocuments.

Заранее благодарим за помощь.

Ответ 1

К сожалению, у меня была такая же проблема, и я решил создать метод расширения, чтобы помочь мне обойти его.

    public static BsonArray ToBsonDocumentArray(this IEnumerable list)
    {
        var array = new BsonArray();
        foreach (var item in list)
        {
            array.Add(item.ToBson());
        }
        return array;
    }

чтобы вы могли:

productCollection.Update(query, Update.Set("store", storeList.ToBsonDocumentArray()));

Ответ 2

В исключении указано, что вы не можете преобразовать массив/список в BsonDocument. Я думаю, что вы хотите преобразовать storeList в [BsonArray][1].

Если storeList уже является массивом BsonDocument или некотором IEnumerable<T>, где можно преобразовать в BsonDocument, вам не нужно вообще вводить переменную storeList.

Ответ 3

Небольшое редактирование для принятой функции ответа:

public static BsonArray ToBsonDocumentArray(this IEnumerable list)
    {
        var array = new BsonArray();
        foreach (var item in list)
        {
            array.Add(item);
        }
        return array;
    }

нам не нужно преобразовывать item.ToBson(). Существует уже неявное преобразование из строки в bson.Thats причина, по которой я получал сообщение об ошибке " Значение String не может быть записано на корневой уровень документа BSON."

Ответ 4

вы должны использовать

BsonDocument.Parse(storeList);

вместо

storeList.ToBsonDocument()