2016-06-06 2 views
0
расслоения плотной

Привета я новичок в nodejs мне нужно обновить значение в массиве с помощью вложенного _id документа моего документа базы данных выглядеть следующим образом ..обновления вложенного массива значения элемента в узле MongoDB

"complaints" : [ 
    { 
     "complaint" : "head light is not working", 
     "complaintid" : ObjectId("57205219a56d2b8c0f9274a4"), 
     "_id" : ObjectId("57454c9249218eb40c1c0d1f"), 
     "labour" : 350, 
     "partCost" : 0, 
     "part" : [ 
      { 
       "id" : ObjectId("56f12eaab915bd9800272ed7"), 
       "estimate" : 450, 
       "partname" : "clutch", 
       "_id" : ObjectId("57454cef49218eb40c1c0d25"), 
       "quantity" : 0, 
       "qrcodes" : [] 
      }, 
      { 
       "id" : ObjectId("56f12eaab915bd9800272ed7"), 
       "estimate" : 450, 
       "partname" : "rear tyre", 
       "_id" : ObjectId("57454cef49218eb40c1c0d24"), 
       "quantity" : 0, 
       "qrcodes" : [] 
      } 
     ], 
     "acceptance" : true, 
     "inspection" : false, 
     "color" : "#8929A9", 
     "status" : "APPROVED", 
     "estimate" : 1200, 
     "solution" : "HEAD LIGHT CHANGE", 
     "problems" : "HEAD LIGHT IS NOT WORKING" 
    }, 

мне нужно изменение количества значение части массива существует внутри массива частей, используя _id из части массива

я пытаюсь это, но он не работает, что я должен сделать для обновления этого значения ...

var partdata = req.payload.parts; 
       for(var k = 0; k< partdata.length ; k++){ 
        CPS.update({ 
         'complaints.part._id' : partdata[k].partid 
        }, { 
         "$inc" : {        
          'complaints.part.$.quantity' : partdata[k].quantity        
         } 
        }).exec 
        (function(err,temp) { 
         if(err){ 
          res(err).code(500); 
         }else{ 
          console.log(temp); 
         } 
        }); 
       } 

ответ

0

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

Это не решение для вашего дела. Но, если вы знаете, индекс, то вы могли бы сделать что-то вроде этого: Предположим образец документа, как:

{ 
    "_id" : ObjectId("57454c9249218eb40c1c0d1f"), 
    "part" : [{ "quantity" : 111 }, { "quantity" : 222 }] 
} 

Тогда этот запрос должен работать.

db.test.update({ "_id" : ObjectId("57454c9249218eb40c1c0d1f") }, { "$set" : { "part.1.quantity" : 999 } }) 

Документ будет модифицируются следующим образом:

{ 
    "_id" : ObjectId("57454c9249218eb40c1c0d1f"), 
    "array" : [{ "quantity" : 222 }, { "quantity" : 999 }] 
} 


Update: Вы можете попробовать следующий способ сделать обновление. Но его не рекомендуется делать, вероятно, вам нужно перестроить схему.

db.test.aggregate([  
    { "$unwind": "$complaints" },  
    { "$unwind": "$complaints.part" }, 
    { "$project": 
     { 
      _id: "$complaints.part._id", 
      partqty: "$complaints.part.quantity" 
     } 
    }, 
]); 

Это должно вернуться следующим образом:

{ 
    "_id" : ObjectId("57454cef49218eb40c1c0d25"), 
    "partqty" : 111 
} 
{ 
    "_id" : ObjectId("57454cef49218eb40c1c0d24"), 
    "partqty" : 222 
} 

Теперь вы можете использовать эту информацию для обновления, например

var cur = db.test.aggregate([  
     { "$unwind": "$complaints" },  
     { "$unwind": "$complaints.part" }, 
     { "$project": 
      { 
       _id: "$complaints.part._id", 
       partqty: "$complaints.part.quantity" 
      } 
     }, 
    ]); 

    while (cur.hasNext()) { 
     var doc = cur.next(); 
     //Note the index should be know again :| 
     db.test.update({ "complaints.part._id": ObjectId("57454cef49218eb40c1c0d25") }, 
         { "$set": { "complaints.$.part.1.quantity": 55 }}, 
         { "multi": true}) 
    } 
+0

В структуре БД, указанной в вопросе 'complaints' является массивом объектов. Решение не основано на том, что я думаю. – Shrabanee

+0

@ titi23: Обновлен, пожалуйста, проверьте, но, как уже упоминалось, это не рекомендуется. –

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