2014-09-16 5 views
0

У меня несколько документов в коллекции, каждый документ имеет такую ​​структуру данных:MongoDB вставки с несколькими условиями

{ 
    _id: "some object id", 
    data1: [ 
     { 
      data2_id : 13233, 
      data2: [ 
       { 
        sub_data1: "text1", 
        sub_data2: "text2", 
        sub_data3: "text3", 

       }, 
       { 
        sub_data1: "text4", 
        sub_data2: "text5", 
        sub_data3: "text6", 
       } 
      ] 
     }, 
     { 
      data2_id : 53233, 
      data2: [ 
       { 
        sub_data1: "text4", 
        sub_data2: "text5", 
        sub_data3: "text6", 

       } 
       ... 
      ] 
     }, 
     { 
      data2_id : 56233, 
      data2: [ 
       { 
        sub_data1: "text7", 
        sub_data2: "text8", 
        sub_data3: "text9", 

       } 
       ... 
      ] 
     }, 
     { 
      data2_id : 53236, 
      data2: [ 
       { 
        sub_data1: "text10", 
        sub_data2: "text22", 
        sub_data3: "text33", 

       } 
       ... 
      ] 
     } 
    ] 
} 

я хотел бы обновить до набора идентификаторов, которые maches некоторого условия, обновлять только субобъект внутри документа.

Я пытается сделать это:

db.collection.update({ 
    "$and": [ 
     { 
      "_id": { 
       "$in": [ 
        { 
         "$id": "54369aca9bc25af3ca8b4568" 
        }, 
        { 
         "$id": "54369aca9bc25af3ca8b4562" 
        } 
       ] 
      } 
     }, 
     { 
      "data1.data2": { 
       "$elemMatch": { 
        "sub_data1": "text4", 
        "sub_data2": "text5" 
       } 
      } 
     } 
    ] 
}, 
{ 
    "data1.data2.$.sub_data3" : "text updated" 
} 
) 

Но я получаю следующее сообщение об ошибке:

Обновление данных в MongoDB не удалось: Дев ** ком:.. 27017: не может использовать часть (data2 of data1.data2.0.sub_data3) для перемещения элемента ...

Любые идеи?

+0

Оператор позиции обновления '$' не может поддерживать вложенный массив. Это означает, что 'data1. $. Data2' приемлемо, но не' data1.data2. $ '. Я обнаружил, что существует более одного 'data2' как элемент условия запроса' data1', поэтому этот оператор позиции '$' не подходит для использования здесь, потому что он только находит первое место и игнорирует другие. Я думаю, вам нужно извлечь весь запрос 'data1' из запроса перед обновлением. – Wizard

ответ

0

Существует открытый вопрос here, который налагает ограничение при попытке обновления элементов массива, вложенных в другой массив.

Кроме того, есть некоторые улучшения, которые вы можете сделать здесь:

  1. Для вашего запроса вам не очень нужны $ и

    db.collection.update ( { "_id" : { "$ в": [ { "$ идентификатор": "54369aca9bc25af3ca8b4568"}, { "$ идентификатор": "54369aca9bc25af3ca8b4562"} ]}, "data1.data2": { "$ elemMatch": { "Sub_data1": "text4", "sub_data2": "text5" } }, {.. обновление ...})

  2. Вы можете использовать $ установить:

    db.collection .update (запрос, {$ множество: { "имя": "Майк"}})

в противном случае, вы можете потерять остальную часть данных, содержащихся в документе.

+0

В конце концов я изменил данные и сохранил их. Это был единственный способ сделать это в этой текущей версии mdb. – user2288183