2013-12-05 4 views
1

Возможно, это популярный вопрос, но мне не удалось найти мое решение. У меня есть коллекция с элементами, как следующее:

_id: ObjectId("52821d6c21c495b30a000015") 
structure: { 
    elements: [{ 
    id: "non-unique-id1", 
    other_data: "value" 
    subs: [{ 
     id: 1, 
     field1: "somevalue", 
     field2: "other value" 
    }, { 
     id: 2, 
     field1: "somevalue", 
     field2: "other value" 
    }, { 
     id: 3, 
     field1: "somevalue", 
     field2: "other value" 
    }] 
    }, { 
    id: "non-unique-id2", 
    subs: [{ 
     id: 1, 
     field1: "somevalue", 
     field2: "other value" 
    }, { 
     id: 2, 
     field1: "somevalue", 
     field2: "other value" 
    }, { 
     id: 3, 
     field1: "somevalue", 
     field2: "other value" 
    }] 
    }] 
} 

Теперь я хотел бы, чтобы удалить элемент из подлодок подмассива учитывая его идентификатор. Я хочу, чтобы удаление произошло на всех element полях.

Я попытался следующим, но даже если я не получаю ошибки, ничего не происходит:

db.objects.update({ 
    "_id" : ObjectId("52821d6c21c495b30a000015") 
},{ 
    $pull: { 
    "structure.elements.subs": {id: 2} 
    } 
}) 

Это должно быть удалены 2 вхождений хэша с id: 2

Попробованной $pullAll как хорошо, но я m Получение ошибки:

Modifier $pushAll/pullAll allowed for arrays only 

Любые идеи о том, как я могу достичь своей цели?

ответ

1

Вы можете использовать $, но запрос будет удалить только 1 подлодку, для двух сабвуфер вашего примера вы должны прогоном дважды. Вам нужно будет написать сценарий для итерации ваших документов.

db.objects.update({ 
    "_id" : ObjectId("52821d6c21c495b30a000015"), 
    "structure.elements.subs.id": 2 
},{ 
    $pull: { 
    "structure.elements.$.subs": {"id": 2} 
    } 
}); 

Если ваша потребность в действии временной администрации, это нормально, но для работы приложения будет слишком плохой

Извините за мой плохой английский :)

2

Поддержка Mongo для обновления вложенных массивов довольно слаба. Вы должны предназначаться каждый элемент массива elements отдельно в вашем $pull:

db.objects.update({ 
    "_id" : ObjectId("52821d6c21c495b30a000015") 
},{ 
    $pull: { 
    "structure.elements.0.subs": {id: 2}, 
    "structure.elements.1.subs": {id: 2} 
    } 
}) 
+0

Хм, я боялся, что .. К сожалению, массив 'elements' не упорядочен и не исправлен, поэтому я не знаю, какие индексы должны быть нацелены. Спасибо, в любом случае. – Oktav