2014-12-18 4 views
1

Как отключить суб-документ от MongoDB, если вы не знаете конкретного имени поддоку?Удалить суб-документ из MongoDB, если вы не знаете имя суб-документа

В других словах я хотел бы идентифицировать суб-документ на основе того или иного значения для его полей ... однако фактическое имя суб-документа неизвестно. Поэтому я хотел бы как-то идентифицировать этот под-документ, а затем удалить его.

Например, когда я соответствовать полю по высоте до 160, я хотел бы, чтобы удалить «бабуин» поддокумент ...

{ Document: { 
    monkey: { 
     height: 100, 
     weight: 40 
    }, 
    baboon: { 
     height: 160, 
     weight: 70 
    } 
} 

Я понимаю, что массивы являются еще одним вариантом ($ заполнители и $ pull операторов), но я стараюсь избегать, так как это приводит к другим осложнениям в другом месте.

+0

Думаю, вы можете сделать это в двух операциях. Сначала найдитеOne и проверьте имя aninaml в своем приложении. Затем выполните операцию анотера, которая отключит выбранного животного. –

+0

Я считаю, что вам нужно изменить свою структуру данных – Disposer

+0

, у вас может быть ** коллекция животных ** с атрибутами * тип *, * высота * и * вес * –

ответ

1

Вам необходимо использовать оператор конвейера $redact, если вы используете mongodb v2.6. Если это не производственная среда, я настоятельно рекомендую вам обновить версию mongodb до последней версии, чтобы пользоваться всеми возможностями операторов mongodb.

Возможно, это самый простой вариант использования оператора этапа $redact.

  • Старт из корневого документа, проверьте, если документ имеет атрибут , где высота 160.
  • Если документ имеет высоту, равную 160, PRUNE его. Else DESCEND в подпапках.
  • Если документ на уровне не имеет атрибута с именем height, , мы присваиваем ему пустое значение, чтобы мы могли сохранить этот документ и пересекать его вспомогательные документы.

Код:

db.collection.aggregate([ 
{$redact:{$cond: 
       [{$eq:[{$ifNull:["$height",""]},160]}, 
       "$$PRUNE", 
       "$$DESCEND" 
       ] 
      } 
} 
]) 

о/р:

{ 
     "_id" : ObjectId("54931b403e20905cb605a802"), 
     "monkey" : { 
       "height" : 100, 
       "weight" : 40 
     } 
} 

Вы можете сделать атомное обновленную информацию о документе, как только вы получите документ с отредактированной информации:

db.collection.aggregate([ 
{$redact:{$cond: 
       [{$eq:[{$ifNull:["$height",""]},160]}, 
       "$$PRUNE", 
       "$$DESCEND" 
       ] 
      } 
} 
]).forEach(function(doc){ 
    db.collection.update({"_id":doc._id},doc) 
}) 
Смежные вопросы