2016-06-24 4 views
0

У меня есть структуру документа, как это:Как обновить/удалить несколько индексов во вложенном массиве MongoDB

{ 

    "_id" : "1234",   
    "name" : "foo", 
    "bar" : [ 
     {"some0":"value0"}, 
     {"some1":"value1"},   
     {"some2":"value2"} 
    ] 
} 

И я просто хочу, чтобы удалить объекты в гнездовой «бар» массив его индексов в массиве например У меня есть массив индексов, например [0,2], который должен удалять «some0» и «some2» из массива.

Я знаю, что Монго в настоящее время не имеет возможности удалить значения по индексу атомарно и обычно this используется вместо:

db.lists.update({}, {$unset : {"bar.0" : 1 }}) 
db.lists.update({}, {$pull : {"bar" : null}}) 

Вопрос: Есть ли более эффективный способ сделать это если мой массив для удаления индексов становится довольно большим (> 100), чем зацикливание над ними вручную и выполняет 2 модификации для каждого из них.

ответ

0

Нет прямого способа вытягивания/удаления по индексу массива. Фактически, это открытый вопрос http://jira.mongodb.org/browse/SERVER-1014, вы можете проголосовать за него.

Только так это то, что вы написали правильно db.lists.update ({}, {$ снята с охраны: { "bar.0": 1}}) db.lists.update ({}, {$ тянуть: { «бар»: нулевая}})

+0

Мой вопрос состоял в том, что если есть более эффективный способ сделать это для большого количества индексов, чем зацикливание над ними и сделать 2 модификации для каждого из них. Я должен сделать это более ясным в вопросе –

0

Вы можете использовать positional$ оператор идентифицирует элемент в массиве для обновления без явного указания позиции элемента в массиве

db.lists.update({'bar.some0':'value0'}, {$unset : {"bar.$" : 1 }}) 

some0, some1 вы можете передать его как динамическую переменную

Смежные вопросы