2016-04-27 6 views
1

У меня есть следующий документ:MongoDB объекты обновления вложенных в массивах вложенных в других массивах без использования индекса массива (вложенная обновления)

{ 
    "_id" : ObjectId("5720bdac527623f2889"), 
    "planes" : [ 
     { 
      "name" : "plane1", 
      "wings" : [ 
       { 
        "name" : "rightDown" 
       }, 
       { 
        "name" : "rightUp" 
       } 
      ] 
     }, 
     { 
      "name" : "plane2", 
      "wings" : [ 
       { 
        "name" : "leftUp", 
       }, 
       { 
        "name" : "leftDown", 
       } 
      ] 
     } 
    ] 
} 

Я хочу, чтобы обновить объект в массиве вложен в другом массиве, без использования индекса массива. В моем примере «plane2» с крылом свойства «leftDown». Является ли это возможным ?

db.planes.update({ 
    planes: { 
    $elemMatch: { 
     wings: { 
     $elemMatch: { 
      name: 'leftUp' 
     } 
     } 
    } 
    } 
}, 
// It would be wonderful if I the $set would look like this, 
// but the error is: 
// "Too many positional (i.e. '$') elements found in path 'planes.$.wings.$'" 
// 
// It seems that $ holds only the value of the first nested 
// object in the array 
{ 
    $set: { 
    'planes.$.wings.$': { 
     name: 'leftMagic' 
    } 
    } 
}) 

MongoDb 3.2 документация говорит: Позиционный $ оператор не может быть использован для запросов, которые пересекают более чем один массив, такие как запросы, которые пересекают массивы, вложенные в других массивах, так как замена для $ заполнителя является единственной значение

Но я все еще жду этого чуда. Есть ли еще какие-нибудь другие чистые/красивые способы сделать обновление в одной съемке?

ответ

0

К сожалению нет, оператор позиционирования может содержать только одно значение. Я не думаю, что вы можете выполнить это обновление одним выстрелом с вашей текущей структурой данных.

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

С небольшой реструктуризацией ваших коллекций вы можете получить обновление до одной операции. Проверьте MongooseJS populate.

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