Удаление встроенного документа MongoDB

Я проводил эксперименты с MongoDB. Коллекция выглядит следующим образом (sample). Проект этот в этот класс 95-й DeleteAlbum строки имеет функцию.

{
    "_id": {
        "$oid": "50e34afce4b0bc114fea2a7e"
    },
    "Ad": "Tarkan", //Artist
    "Albums": [
        {
            "_id": {
                "$oid": "50e34afce4b0bc114fea2a4e"
            },
            "Isim": "DUDU", //Name
            "Yil": 2005, //Year
            "Resim": "http://www.gercekpop.com/wp-content/uploads/2003/12/tarkan-dudu.jpg" //Image
        },
        {
            "_id": {
                "$oid": "50e34afce4b0bc114fea2a3e"
            },
            "Isim": "Kuzu Kuzu",
            "Yil": 2008,
            "Resim": "http://o.scdn.co/300/bf6423177c32224f25dc742f3ffe5450e441d68d"
        }
    ]
}

строка 75-й метод Add в функции CreateAlbum работает.

 Artist.Albums.Add(Album)
 Return Collection.Save(Artist, SafeMode.True).Ok

но метод Remove в DeleteAlbum не работает.

Artist.Albums.Remove(album)
Return Collection.Save(sanatci, SafeMode.True).Ok

Каким должен быть метод удаления встроенного документа? Спасибо за помощь.


person Berat Bilgin    schedule 13.01.2013    source источник
comment
Используйте update с оператором $pull, чтобы удалить элемент из поля массива. .   -  person JohnnyHK    schedule 13.01.2013
comment
Привет @JohnnyHK. У вас есть пример с драйвером mongodb csharp.   -  person Berat Bilgin    schedule 13.01.2013


Ответы (2)


Вот как можно удалить элемент из массива Albums первого документа, содержащего его, по его _id (в C#):

var query = Query.EQ("Albums._id", new ObjectId("50e34afce4b0bc114fea2a4e"));
var update = Update.Pull("Albums", new BsonDocument(){
    { "_id", new ObjectId("50e34afce4b0bc114fea2a4e") }
});
collection.Update(query, update);

Я не владею VB, но ваш метод DeleteAlbum должен измениться на что-то вроде:

Public Function DeleteAlbum(Artist As Sanatci, album As Album) As Boolean
    Try
        Return Collection.Update(
            Query.EQ("Albums._id", album._id),
            Update.Pull("Albums", Query.EQ("_id", album._id)), SafeMode.True
        ).Ok
    Catch ex As MongoCommandException
        Dim msgLog As String = ex.Message
        Return False
    End Try
End Function
person JohnnyHK    schedule 19.01.2013

Mongo не похож на Linq-to-SQL или Entity Framework. Вместо того, чтобы вызывать Artist.Albums.Remove(album) и затем пытаться сохранить новое состояние объекта в коллекции, вам нужно вызвать функцию .Remove() коллекции.

В этой статье показано, как это сделать на C#:

Как удалить один «документ» по «ID» с использованием официального драйвера C# для MongoDB?

person ryan1234    schedule 13.01.2013
comment
Извините, я думал, вы хотите удалить художника из коллекции. Если вы просто хотите изменить массив альбомов для объекта, рассмотрите ответ JohnnyHK. Вы можете добавить новый объект (который заменит существующий объект новым с вашим изменением) или удалить элемент из массива. Я всегда предпочитаю добавлять элементы, что означает вставку нового объекта, если ничего не существует с этим _id, или обновление всего объекта, если он уже существует. - person ryan1234; 13.01.2013