2015-01-23 2 views
1

У меня есть база данных с следующим документом:pullAll при удалении внедренных объектов

> db.bios.find({"name.first":"James"}).pretty() 
{ 
     "_id" : 9, 
     "name" : { 
       "first" : "James", 
       "last" : "Gosling" 
     }, 
     "birth" : ISODate("1955-05-19T04:00:00Z"), 
     "contribs" : [ 
       "Java", 
       "C", 
       "Scala", 
       "UNIX" 
     ], 
     "awards" : [ 
       { 
         "award" : "The Economist Innovation Award", 
         "year" : 2002, 
         "by" : "The Economist" 
       }, 
       { 
         "award" : "Officer of the Order of Canada", 
         "year" : 2007, 
         "by" : "Canada" 
       }, 
       { 
         "award" : "nobel", 
         "by" : "Stockholm" 
       }, 
       { 
         "award" : "nobel2", 
         "by" : "Stockholm" 
       }, 
       { 
         "award" : "oscar", 
         "year" : 2015, 
         "by" : "Hollywood" 
       } 
     ] 
} 

Я пытаюсь написать запрос, чтобы удалить объекты награды выданный «Стокгольмом» или «Голливудом» из массива наград, но ниже запрос не работает:

> db.bios.update({"name.first":"James"}, {$pullAll:{"awards.by":["Stockholm","Hollywood"]}}) 
WriteResult({ 
     "nMatched" : 0, 
     "nUpserted" : 0, 
     "nModified" : 0, 
     "writeError" : { 
       "code" : 16837, 
       "errmsg" : "cannot use the part (awards of awards.by) to travers 
e the element ({awards: [ { award: \"The Economist Innovation Award\", year: 200 
2.0, by: \"The Economist\" }, { award: \"Officer of the Order of Canada\", year: 
2007.0, by: \"Canada\" }, { award: \"nobel\", by: \"Stockholm\" }, { award: \"n 
obel2\", by: \"Stockholm\" }, { award: \"oscar\", year: 2015.0, by: \"Hollywood\ 
" } ]})" 
     } 
}) 
> 

Похожие запрос работает для удаления элементов из массива: вклад

> db.bios.update({"name.first":"James"}, {$pullAll:{"contribs":["Java","Fortran" 
]}}) 
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 

, поэтому проблема здесь заключается в том, что я имею дело со встроенным объектом.

Буду признателен за вашу помощь.

Спасибо!

ответ

3

Оператор $pullAll на самом деле является ярлыком «специального случая», который работает с массивами с определенными значениями в них, такими как ваш альтернативный случай.

Что вы действительно хотите, это $pull, и этот аргумент является «запросом» для документов, содержащихся в массиве. Таким образом, ваш список затем становится аргументом $in:

db.bios.update(
    { "name.first": "James" }, 
    { 
     "$pull": { 
     "awards": { "by": { "$in": ["Stockholm", "Hollywood"] } } 
     } 
    } 
) 

Так что в вашем другом, например, больше форма $pullAll будет:

db.bios.update(
    { "name.first": "James" }, 
    { 
     "$pull": { "contribs": { "$in": ["Java","UNIX"] } } 
    } 
) 

То же самое, но только «обыкновенное письмо» форма.

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