2016-07-12 3 views
0

У меня есть документ в mongodb с 2 уровнями глубокого вложенного массива объектов, которые мне нужно обновить, что-то вроде этого.Mongodb обновляет объект в многоуровневом массиве

{ 
    "id":12362, 
    "onGoing":[ 
    { 
     "id":14597, 
     "offers":[ 
     { 
      "id":56897, 
      "status":"validated" 
     }, 
     { 
      "id":86127, 
      "status":"validated" 
     } 
     ] 
    }, 
    { 
     "id":89451, 
     "offers":[ 
     { 
      "id":12235, 
      "status":"validated" 
     }, 
     { 
      "id":56457, 
      "status":"validated" 
     } 
     ] 
    } 
    ] 
} 

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

Я пытался обновить как

db.repairJobs.update({ 
    "onGoing.offers":{ 
    $elemMatch:{ 
     _id:{ 
     $in:[ 
      '56897', '56457' 
     ] 
     } 
    } 
    } 
}, 
{ 
    $set:{ 
    "ongoing.offers.$.status":"ACCEPTED" 
    } 
}); 

Но получаю ошибку: не может использовать часть (продолжающуюся от ongoing.offers.0.status), чтобы пересечь элемент ({продолжается: [{_id: нуль ...

есть ли какие-либо способы для обновления, решение должно быть совместимы с пружинными данными.

ответ

0

насколько я знаю, там нет возможности обновлять документы глубоких два уровня в MongoDB. Я наткнулся на этот элемент JIRA. Я не думаю, что есть способ использовать несколько $ операторов в операциях обновления.

https://jira.mongodb.org/browse/SERVER-831

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

+0

Спасибо за ответ – user3794642

0

JS путь:

db.repairJobs.find().forEach(function(doc){ 
//make changes on the JSON(BSON) object here. 
db.repairJobs.save(doc); 
} 
); 

пример:

db.repairJobs.find().forEach(function(doc){ 
    var valueToCheck = ['56897', '56457'] 
    for(var i =0; i< doc.ongoing.offers.length; i ++){ 
     if(valueToCheck.indexOf(doc.ongoing.offers[i].id) > -1){ 
      doc.ongoing.offers[i].status = "ACCEPTED" 
     } 
    } 
    db.repairJobs.save(doc); 
    } 
); 
Смежные вопросы