2016-09-16 1 views
1

Ich arbeite an einer Express-Js-Anwendung, wo ich ein verschachteltes Array aktualisieren muss. 1) Schema:Aktualisierung von verschachtelten Array-Mongoose

//Creating a mongoose schema 
var userSchema = mongoose.Schema({ 
_id: {type: String, required:true}, 
name: String, 
sensors: [{ 
    sensor_name: {type: String, required:true}, 
    measurements: [{time: String}] 
}] }); 

2) Hier ist der Code-Schnipsel und Erklärung ist unten:

router.route('/sensors_update/:_id/:sensor_name/') 
.post(function (req, res) { 
User.findOneAndUpdate({_id:req.body._id}, {$push: {"sensors" : 
{"sensor_name" : req.body.sensor_name , "measurements.0.time": req.body.time } } }, 
{new:true},function(err, newSensor) { 
if (err) 
res.send(err); 
res.send(newSensor) 
}); }); 

Ich bin der Lage, erfolgreich einen Wert an die Messungen Array Aktualisieren der findOneAndUpdate mit Push-Technik aber ich versage, wenn ich versuche, dem Sensor-Array mehrere Messungen hinzuzufügen. Hier

aktuell json ich, wenn ich erhalte, wenn ich eine zweite Messung an die Sensoren Array schreiben:

{ 
"_id": "Manasa", 
"name": "Manasa Sub", 
"__v": 0, 
"sensors": [ 
{ 
    "sensor_name": "ras", 
    "_id": "57da0a4bf3884d1fb2234c74", 
    "measurements": [ 
    { 
     "time": "8:00" 
    } 
    ] 
}, 
{ 
    "sensor_name": "ras", 
    "_id": "57da0a68f3884d1fb2234c75", 
    "measurements": [ 
    { 
     "time": "9:00" 
    } 
    ] 
    }]} 

Aber das richtige Format Ich möchte ist, mehrere Messungen mit dem Sensoren Array wie folgt veröffentlichen:

enter image description here

Rechts JSON-Format wäre:

{ 
"_id" : "Manasa", 
"name" : "Manasa Sub", 
"sensors" : [ 
    { 
     "sensor_name" : "ras", 
     "_id" : ObjectId("57da0a4bf3884d1fb2234c74"), 
     "measurements" : [ 
      { 
       "time" : "8:00" 
      } 
     ], 
     "measurements" : [ 
      { 
       "time" : "9:00" 
      } 
     ] 
    }], 
"__v" : 0 } 

Bitte schlagen Sie einige Ideen diesbezüglich vor. Danke im Voraus.

+0

Vielleicht kann diese [Antwort] (http://stackoverflow.com/questions/23577123/update-nested-array-with-mongoose-mongodb?rq=1) Ihnen helfen, den Weg zu finden. –

+0

Danke, aber ich bin in der Lage, einen einzelnen Wert zu aktualisieren. Mein Problem ist, dass ich versage, während ich versuche, mehrere Messwerte (Array) auf Grundlage des Sensornamens in das Sensor-Array zu übertragen. – HitRefresh

+0

Wie @Hayden vorgeschlagen, ändern Sie besser Ihr Schema. Ihr aktuelles Schema ist praktisch ungültig. Schlüssel innerhalb eines Objekts müssen eindeutig sein. Versuchen Sie einen Online-JSON-Parser und Sie werden den Fehler bemerken. –

Antwort

4

Vielleicht möchten Sie Ihr Datenmodell überdenken. Wie es derzeit ist, können Sie nicht erreichen, was Sie wollen. Das Feld Sensoren bezieht sich auf ein Array. Im idealen Dokumentformat, das Sie bereitgestellt haben, haben Sie ein einzelnes Objekt in diesem Array. Dann haben Sie innerhalb dieses Objekts zwei Felder mit genau demselben Schlüssel. In einem JSON-Objekt oder einem Mongo-Dokument in diesem Kontext können Sie keine doppelten Schlüssel innerhalb desselben Objekts haben.

Es ist nicht genau klar, was Sie hier suchen, aber vielleicht wäre es am besten für so etwas zu gehen:

{ 
"_id" : "Manasa", 
"name" : "Manasa Sub", 
"sensors" : [ 
    { 
    "sensor_name" : "ras", 
    "_id" : ObjectId("57da0a4bf3884d1fb2234c74"), 
    "measurements" : [ 
     { 
      "time" : "8:00" 
     }, 
     { 
      "time" : "9:00" 
     } 
    ] 
}, 
{ 
    // next sensor in the sensors array with similar format 
    "_id": "", 
    "name": "", 
    "measurements": [] 
}], 
} 

Wenn das ist, was Sie wollen, dann können Sie dies versuchen:

User.findOneAndUpdate(
    { _id:req.body._id "sensors.sensor_name": req.body.sensor_name }, 
    { $push: { "sensors.0.measurements": { "time": req.body.time } } } 
); 

Und als eine Randnotiz, sind, wenn Sie jemals in den Messungen Array in jedem Objekt einen einzelnen String gehen zu speichern, können Sie { time: "value" } anstelle des gesamten Objekts, die tatsächlichen Werte nur speichern. Vielleicht finden Sie die Daten so leichter zu handhaben.

Hoffe, das hilft.

Verwandte Themen