2017-09-27 2 views
1

Ok, j'ai cette collection:mise à jour des objets multiples dans un tableau d'objet multi req.body

{ 
    "_id" : ObjectId("59baa8af86e5df3984674639"), 
    "centralPath" : "C:\\Users\\konrad.sobon\\OneDrive - HOK\\GoogleDrive\\Work\\DynamoWork\\142_SeatManifestGenerator\\RVT2018\\CBUEC_HOK_IN-central.rvt", 
    "totalFamilies" : 31, 
    "unusedFamilies" : 18, 
    "oversizedFamilies" : 0, 
    "inPlaceFamilies" : 0, 
    "createdBy" : "konrad.sobon", 
    "createdOn" : ISODate("2017-09-14T20:19:09.525Z"), 
    "families" : [ 
     { 
      "name" : "Spot Elevation - Target Filled_HOK_I", 
      "size" : "1.2Mb", 
      "sizeValue" : 1200000, 
      "instances" : 0, 
      "elementId" : 6158, 
      "isFailingChecks" : true, 
      "isDeleted" : false, 
      "_id" : ObjectId("59bae43d2720015998392905"), 
      "tasks" : [], 
      "parametersCount" : 0, 
      "nestedFamilyCount" : 1, 
      "voidCount" : 0, 
      "refPlaneCount" : 2, 
      "arrayCount" : 0 
     }, 
     { 
      "name" : "Section Head - Filled_HOK_I", 
      "size" : "140kb", 
      "sizeValue" : 145760, 
      "instances" : 0, 
      "elementId" : 8762, 
      "isFailingChecks" : true, 
      "isDeleted" : false, 
      "_id" : ObjectId("59bae43d2720015998392904"), 
      "tasks" : [], 
      "parametersCount" : 0, 
      "nestedFamilyCount" : 1, 
      "voidCount" : 0, 
      "refPlaneCount" : 3, 
      "arrayCount" : 0 
     }, 
     { 
      "name" : "Railing Tag_HOK_I", 
      "size" : "244kb", 
      "sizeValue" : 249856, 
      "instances" : 0, 
      "elementId" : 12426, 
      "isFailingChecks" : true, 
      "isDeleted" : false, 
      "_id" : ObjectId("59bae43d2720015998392903"), 
      "tasks" : [], 
      "parametersCount" : 3, 
      "nestedFamilyCount" : 1, 
      "voidCount" : 0, 
      "refPlaneCount" : 2, 
      "arrayCount" : 0 
     }, 
     { 
      "name" : "Fixed", 
      "size" : "316kb", 
      "sizeValue" : 323584, 
      "instances" : 0, 
      "elementId" : 3499132, 
      "isFailingChecks" : true, 
      "isDeleted" : false, 
      "_id" : ObjectId("59bae43d27200159983928e7"), 
      "tasks" : [], 
      "parametersCount" : 4, 
      "nestedFamilyCount" : 2, 
      "voidCount" : 0, 
      "refPlaneCount" : 18, 
      "arrayCount" : 0 
     } 
    ], 
    "__v" : 0 
} 

Ce que je suis en train de faire est d'envoyer une demande de mettre à jour certaines « familles » dans cette collection. J'ai un tableau de ces objets de famille qui ressemble à ceci:

{"key": [ 
      { 
       "name" : "New Spot Elevation - Target Filled_HOK_I", 
       "size" : "1.2Mb", 
       "sizeValue" : 1200000, 
       "instances" : 0, 
       "elementId" : 6158, 
       "isFailingChecks" : true, 
       "isDeleted" : false, 
       "Id" : "59bae43d2720015998392905", 
       "tasks" : [], 
       "parametersCount" : 0, 
       "nestedFamilyCount" : 1, 
       "voidCount" : 0, 
       "refPlaneCount" : 2, 
       "arrayCount" : 0 
      }, 
      { 
       "name" : "New Section Head - Filled_HOK_I", 
       "size" : "140kb", 
       "sizeValue" : 145760, 
       "instances" : 0, 
       "elementId" : 8762, 
       "isFailingChecks" : true, 
       "isDeleted" : false, 
       "Id" : "59bae43d2720015998392904", 
       "tasks" : [], 
       "parametersCount" : 0, 
       "nestedFamilyCount" : 1, 
       "voidCount" : 0, 
       "refPlaneCount" : 3, 
       "arrayCount" : 0 
      } 
     ]} 

Maintenant, je dois être en mesure de trouver et mettre à jour chacune des familles spécifiées. Je pensais que je peux juste itérer sur le tableau entrant (je l'envoie dans un req.body), et puis faire un tableau de Ids qui aurait besoin d'être mis à jour afin que je puisse utiliser l'opérateur $ in dans mongo. Après cela, j'ai pensé que je peux utiliser l'identifiant, pour récupérer les propriétés qui m'intéressent et juste utiliser $ set pour les mettre à jour. Ma tentative ici:

module.exports.updateMultipleFamilies = function (req, res) { 
    var id = req.params.id; 
    var famIds = []; // [ObjectId] 
    var newFamilies = {}; // {"id_string" : family} 
    for(var key in req.body) { 
     if(req.body.hasOwnProperty(key)){ 
      for(var i = 0; i < req.body[key].length; i++){ 
       var family = req.body[key][i]; 
       newFamilies[family.Id] = family; 
       famIds.push(mongoose.Types.ObjectId(family.Id)); 
      } 
     } 
    } 

    Families 
     .updateMany(
      {_id: id, 'families._id': {$in: famIds}}, 
      {$set: {'name': newFamilies["current_document_id_help"].name}}, function(err, result){ 
       if(err) { 
        res 
         .status(400) 
         .json(err); 
       } else { 
        res 
         .status(202) 
         .json(result); 
       } 
      } 
     ) 
}; 

Edit:

donc j'ai essayé une approche différente de l'appel bulkWrite. Il ne me donne pas d'erreurs mais il ne met pas non plus à jour quoi que ce soit. Des idées pourquoi?

module.exports.updateMultipleFamilies1 = function (req, res) { 
    var id = req.params.id; 
    var bulkOps = []; 

    for(var key in req.body) { 
     if(req.body.hasOwnProperty(key)){ 
      bulkOps = req.body[key].map(function(item){ 
       return { 
        'updateOne': { 
         'filter': {'_id': id, 'families._id': mongoose.Types.ObjectId(item.Id)}, 
         'update': {'$set': {'families.$.name': item.name}}, 
         'upsert': false 
        } 
       } 
      }) 
     } 
    } 

    Families.collection 
     .bulkWrite(
      bulkOps, 
      {'ordered': true, w:1}, function(err, result){ 
      if(err) { 
       res 
        .status(400) 
        .json(err); 
      } else { 
       res 
        .status(202) 
        .json(result); 
      } 
     }) 

}; 
+0

Vérifiez cette réponse ici: https://stackoverflow.com/questions/40904007/mongodb-update-multiple-subdocuments-with-or-query - Vous devez mettre à jour tous les sous documenter individuellement dans votre boucle supérieure, je crains, où vous êtes actuellement en utilisant votre tableau 'newFamilies'. – dnickless

Répondre

-1

Vous devez prendre le tableau des familles, modifier le code dans l'application, puis mettre à jour le tableau des familles à nouveau. ou vous pouvez essayer do {$ set: { 'familles $ nom.'.: NewFamilies [ "current_document_id_help"] name} .} , mais je ne suis pas sûr si cette mise à jour wont vous tous les familles

première solution:

var id = req.params.id; 
 
    yourCollation.findById(id,function(err, doc){ 
 
     
 
     if(req.body.key && req.body.key.constructor === Array){ 
 
      for(var i = 0; i < req.body.key.length; i++){ 
 
      for(var x in doc.families){ 
 
       if(family.id === doc.families[x].id){ 
 
        doc.families[x] = family; 
 
       } 
 
      } 
 
      } 
 
     } 
 
    
 
    
 
    doc.save() 
 
    })

+0

Cela n'a aucun sens pour moi. Envie de partager du code pour que je puisse comprendre ce que tu veux dire? – konrad

+0

J'ai mis à jour la réponse, essayez ce code. vous n'avez pas dit votre nom de collation alors changez votre collection –