MongoDB嵌入式文档删除

时间:2013-01-13 01:39:54

标签: .net vb.net mongodb mongodb-.net-driver mongodb-query

我一直在MongoDB上做实验。收集如下(sample)。 项目this位于this类第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"
        }
    ]
}

Add函数中的第75行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

删除嵌入文档的方法应该是什么? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

以下是如何从Albums(在C#中)中删除包含它的第一个文档的_id数组中的元素:

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

答案 1 :(得分:0)

Mongo与Linq-to-SQL或Entity Framework不同。而不是调用Artist.Albums.Remove(相册),然后尝试将对象的新状态保存到集合中,您需要调用集合的.Remove()函数。

本文介绍了如何在C#中执行此操作:

How to remove one 'document' by 'ID' using the Official C# Driver for MongoDB?