2013-12-09 4 views
3

Пример документа в монго выглядит следующим образом, однако моя коллекция содержит несколько тысяч документов, где некоторые из них имеют все следующие тесты, а некоторые имеют только подмножество следующих тестов :Обновление объектов внутри вложенного массива в mongodb с несколькими критериями

{ 
"_id" : ObjectId("52435f0f6f73205f7d37a2b0"), 
"ID" : { 
    "schoolID" : "1234" 
}, 
"institution" : { 
    "tests" : [ 
     { 
      "test" : "SAT Math", 
      "25th_percentile" : null, 
      "mean" : 404, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "SAT Verbal", 
      "25th_percentile" : null, 
      "mean" : 355, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "SAT Writing", 
      "25th_percentile" : null, 
      "mean" : 363, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "SAT Composite", 
      "25th_percentile" : null, 
      "mean" : 1122, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "ACT Math", 
      "25th_percentile" : null, 
      "mean" : null, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "ACT English", 
      "25th_percentile" : null, 
      "mean" : null, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "ACT Reading", 
      "25th_percentile" : null, 
      "mean" : null, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "ACT Science", 
      "25th_percentile" : null, 
      "mean" : null, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     }, 
     { 
      "test" : "ACT Composite", 
      "25th_percentile" : null, 
      "mean" : null, 
      "50th_percentile" : null, 
      "75th_percentile" : null 
     } 
    ] 
} 
} 

Я в настоящее время получил отдельные данные для нескольких школ и хочу обновить документ, в котором идентификатор «schoolID» и где «испытание» является «ACT Composite» и «означает» равен нуль.

Я попытался следующие:

db.collection.update({$and:[{"ID.schoolID":"1234"}, {"institution.tests.$.test": "ACT Composite"}, {"institution.tests.$.mean": null}]}, {"$set":{"institution.tests.$.mean":"trial"}}) 

однако, объект не был обновлен. Я также попытался с помощью $ elemMatch:

db.collection.update({$and:[{"ID.schoolID":"1234"},{"institution.tests": {$elemMatch:{"test": "ACT Composite", "mean":null}}}]},{"institution.tests.$.mean":"trial"}) 

при использовании $ elemMatch я был в состоянии получить подсчет количества документов, где это верно:

db.collection.find({"institution.tests":{$elemMatch:{"test":"ACT Composite", "mean":null}}}).count() 

Наконец, я также пытался написав скрипт python с помощью pymongo, который превращает объект в pandas dataframe (поскольку я более знаком с тем, как это сделать в R с использованием фрейма данных и «ifelse», однако у меня возникли проблемы только с обновлением конкретного объекта, тест "является" ACT Composite "и" mean "является нулевым.

Любая помощь будет принята с благодарностью! Спасибо заранее!

ответ

2

Вы можете сделать это следующим образом:

db.collection.update ({ "ID.schoolID": "1234", "institution.tests": {$ elemMatch: {Тест: "ACT Composite", mean: null}}}, {$ set: {"instit.tests. $. mean": "trial"}})

+0

Благодарим за предложение !! к сожалению, это не обновляло документ :(Вместо этого он обновлялся там, где «test»: «ACT Math» – RCN

+0

У меня есть обновленный запрос. Не могли бы вы попробовать еще раз. –

+0

Да! Это сработало !! СПАСИБО ВАМ ТАК ЕЩЕ! я так благодарен! – RCN

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