Используя драйвер C # mongo, как сериализовать массив пользовательских объектов для его хранения? - PullRequest
12 голосов
/ 03 апреля 2012

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

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

Я хотел бы, например, изменить имя «Store Y» на Store 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.

Заранее спасибо за помощь.

Ответы [ 4 ]

7 голосов
/ 22 августа 2012

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

    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 голосов
/ 03 апреля 2012

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

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

0 голосов
/ 19 июня 2014

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

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

нам не нужно конвертировать item.ToBson ().Уже есть неявное преобразование из строки в bson. По этой причине я получаю сообщение об ошибке " Невозможно записать значение String на корневой уровень документа BSON. "

0 голосов
/ 13 ноября 2013

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

BsonDocument.Parse(storeList);

вместо

storeList.ToBsonDocument()
...