2014-10-13 4 views
0

Хорошо, так что я ищу, чтобы обновить все документы, соответствующие ниже запрос:

var searchArray = ["AH Refer" 
]; 
db.ReasonTest.find({ 
$and: [ 
    { 
     "Values.Reason": { 
      $in: searchArray 
     } 
    }, 
    { 
     "Values.Modules": { 
      $all: ["Provider Search"] 
     } 
    } 
] 
}); 

Моя структура документа выглядит следующим образом:

{ 
"_id" : ObjectId("537398e92db5868b145f5f29"), 
"ID" : NumberLong(1), 
"Name" : "MCC", 
"Values" : [ 
    { 
     "ID" : NumberLong(1016), 
     "Reason" : "COB", 
     "Modules" : [ 
      "SRA" 
     ] 
    }, 
    { 
     "ID" : NumberLong(104), 
     "Reason" : "AH Refer", 
     "Modules" : [ 
      "Provider Search" 
     ] 

    } 
] 
} 

И в основном, что я хочу сделать, найти все причины (корневой документ), который имеет одно из значений выше (например, «AH Refer») в поле Reason массива Values. Если у них есть «Поиск провайдера» в массиве Modules, я хочу удалить «Поиск провайдера» из массива Modules на это значение в «Значениях». У меня очень тяжелое время для этого клиента. Очевидно, что их структура не идеальна (поддержка вложенных массивов в Mongo не очень хороша), но я надеюсь, что один из вас wizkids может мне помочь. Заранее спасибо! :)

ответ

1

По описаниям в нижней части вопроса, моего понимания со стороны запроса является: как ReasonModules и соответствуют критериям, в том же элементе «ценности», то документ, который необходимо обновить. Итак, я изменил часть запроса на $elemMatch соответственно.

var searchArray = [ "AH Refer to CMC: Claims Inquiry", 
     "AH Refer to CMC: Eligibility Inquiry", 
     "AH Refer to CMC: Requested Benefit Information", 
     "After Hours - Referred to CMC", "After Hours Referred to RHBA" ]; 

var moduleValue = "Provider Search"; 

while (db.ReasonTest_Kyle.update({ 
    Values : { 
     $elemMatch : { 
      Reason : { 
       $in : searchArray 
      }, 
      Modules : moduleValue 
     } 
    } 
}, { 
    $pull : { 
     "Values.$.Modules" : moduleValue 
    } 
}, { 
    multi : true 
}).nModified); 

Когда nModified == 0, все документы были изменены, а цикл завершен.
Недостатком приведенного выше кода является, вероятно, много раз, чтобы обновить один и тот же документ.
Но это потокобезопасный.


APPEND

Следующий код совместим с MongoDB версии перед тем версии 2.6

var searchArray = [ "AH Refer to CMC: Claims Inquiry", 
     "AH Refer to CMC: Eligibility Inquiry", 
     "AH Refer to CMC: Requested Benefit Information", 
     "After Hours - Referred to CMC", "After Hours Referred to RHBA" ]; 

var moduleValue = "Provider Search"; 

var query = { 
     Values : { 
      $elemMatch : { 
       Reason : { 
        $in : searchArray 
       }, 
       Modules : moduleValue 
      } 
     } 
    }; 

var nCallUpdate = 0; 

while (db.ReasonTest_Kyle.findOne(query, {_id :1})) { 
    db.ReasonTest_Kyle.update(query, { 
     $pull : { 
      "Values.$.Modules" : moduleValue 
     } 
    }, { 
     multi : true 
    }); 
    nCallUpdate++; 
} 
+0

Я получаю сообщение об ошибке говорящее результат не имеет свойства? Кроме того, поведение, которое я вижу, похоже на то, что было создано моим решением. Он удаляет модуль «Поиск провайдера» из первого, который он соответствует, но все остальные, которые он должен удалить, все еще существуют. –

+0

Я заметил, что вы упомянули об этом, возможно, придется запускать несколько раз. Не могли бы вы объяснить, почему это так? –

+0

@ Kyle Richter, вы можете вставить здесь полное сообщение об ошибке? – Wizard