Мне нужно удалить вложенный документ в MongoDB

Это моя структура:

{
    "_id" : ObjectId("52ebf3ba71616b871600000c"),
    "components" : [
        {
            "type" : "text",
            "text_type" : "subtitle",
            "pos_x" : 198.384521484375,
            "pos_y" : 114.43489074707031,
            "content" : "New subtitle",
            "font" : "",
            "font_size" : "",
            "color" : "",
            "bold" : false,
            "italic" : false,
            "underlined" : false,
            "rotation" : 0,
            "scale" : 0,
            "custom_css" : "",
            "_id" : ObjectId("52ebf3c171616b871600000d")
        },
        {
            "type" : "text",
            "text_type" : "title",
            "pos_x" : 198.384521484375,
            "pos_y" : 114.43489074707031,
            "content" : "New title",
            "font" : "",
            "font_size" : "",
            "color" : "",
            "bold" : false,
            "italic" : false,
            "underlined" : false,
            "rotation" : 0,
            "scale" : 0,
            "custom_css" : "",
            "_id" : ObjectId("52ebf3c371616b871600000e")
        },
        {
            "type" : "text",
            "text_type" : "title",
            "pos_x" : 279.32373046875,
            "pos_y" : 265.3794403076172,
            "content" : "New title",
            "font" : "",
            "font_size" : "",
            "color" : "",
            "bold" : false,
            "italic" : false,
            "underlined" : false,
            "rotation" : 0,
            "scale" : 0,
            "custom_css" : "",
            "_id" : ObjectId("52ebf44471616b871600000f")
        },
        {
            "type" : "text",
            "text_type" : "subtitle",
            "pos_x" : 55.32373046875,
            "pos_y" : 35.37944030761719,
            "content" : "New subtitle",
            "font" : "",
            "font_size" : "",
            "color" : "",
            "bold" : false,
            "italic" : false,
            "underlined" : false,
            "rotation" : 0,
            "scale" : 0,
            "custom_css" : "",
            "_id" : ObjectId("52ebf44571616b8716000010")
        },
        {
            "type" : "image",
            "file" : "",
            "external_url" : "",
            "size" : 40,
            "pos_x" : 0,
            "pos_y" : 0,
            "rotation" : 0,
            "scale" : 0,
            "custom_css" : "",
            "_id" : ObjectId("52ebf4d971616b8716000011")
        }
    ],
    "number" : 0,
    "pos_x" : 0,
    "pos_y" : 0,
    "presentation_id" : 46,
    "rotation_x" : 0,
    "rotation_y" : 0,
    "rotation_z" : 0,
    "scale" : 1
}

Мне нужно удалить вложенный документ, в данном случае «компонент», _id которого равен «52ebf4d971616b8716000011».

Я пробовал с этим:

db.slides.update({"components._id": ObjectId("52ebf4d971616b8716000011")},
{$pull: {"components._id": ObjectId("52ebf4d971616b8716000011"}})

Но не получается, документ остается прежним.


person Eduardo    schedule 31.01.2014    source источник
comment
Забудь это. - спрашивал я себя. Проблема заключалась в структуре $ pull: db.slides.update ({components._id: ObjectId (52ebf4d971616b8716000011)}, {$ pull: {components: {_id: ObjectId (52ebf4d971616b8716000011)}}})   -  person Eduardo    schedule 01.02.2014
comment
Не могли бы вы опубликовать, что вы в итоге сделали, чтобы решить эту проблему?   -  person Aaron    schedule 01.02.2014


Ответы (2)


Ваша попытка обновления не работает, потому что вы пытаетесь извлечь из components._id (который не является массивом) вместо извлечения из components (который является массивом) на основе _id (это поле, в котором вы пытаетесь вытащить документы).

Вам следует изменить свой запрос на:

db.slides.update(
  { 'components._id': some-id }, 
  { $pull: { components: { _id: some-id } } }); 

как предложил @ BryceAtNetwork23.

person Avish    schedule 31.01.2014

Попробуй это:

db.slides.update( {"components._id": ObjectId("52ebf4d971616b8716000011")},
{$pull: {components: {"_id": ObjectId("52ebf4d971616b8716000011")}}}, false, false)
person Aaron    schedule 31.01.2014
comment
Я одобряю, потому что вы первый правильно ответили. - person Avish; 01.02.2014