2016-09-16 2 views
1

중첩 배열을 업데이트해야하는 express js 응용 프로그램을 작성 중입니다. 1) 스키마 : 여기Nested 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) 는 코드이며, 설명은 다음과 같습니다 :

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) 
}); }); 

나는 성공적으로 푸시 기술로 findOneAndUpdate를 사용하여 측정 배열에 값을 업데이트 할 수 있어요 하지만 센서 배열에 여러 측정 값을 추가하려고하면 실패합니다.

{ 
"_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" 
    } 
    ] 
    }]} 

하지만이 같은 센서 어레이를 사용하여 여러 측정을 게시되어 원하는 올바른 형식 : 나는 센서 어레이에 두 번째 측정을 게시 할 때 내가 얻을 경우 여기

내가 얻을 현재 JSON입니다

enter image description here

오른쪽 JSON 형식은 다음과 같습니다

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

이것에 관해 몇 가지 제안을하십시오. 미리 감사드립니다.

+0

어쩌면이 [답변] (http://stackoverflow.com/questions/23577123/update-nested-array-with-mongoose-mongodb?rq=1)이 길을 찾을 수 있습니다. –

+0

감사하지만 단일 값을 업데이트 할 수 있지만 센서 이름을 기준으로 센서 배열에 여러 측정 (배열) 값을 업데이트하는 동안 실패합니다. – HitRefresh

+0

@Hayden이 제안 했으므로 스키마를 더 잘 변경하십시오. 귀하의 현재 스키마는 사실상 유효하지 않습니다. 객체 내부의 키는 고유해야합니다. 온라인 JSON 구문 분석기를 사용하면 오류가 발생합니다. –

답변

4

데이터 모델을 다시 생각해보십시오. 현재로서는 원하는 것을 성취 할 수 없습니다. 센서 필드는 어레이를 나타냅니다. 사용자가 제공 한 이상적인 문서 형식에서는 해당 배열 내에 단일 개체가 있습니다. 그런 다음 해당 객체 내부에 똑같은 키가있는 두 개의 필드가 있습니다. 이 컨텍스트의 JSON 객체 또는 mongo 문서에서 동일한 객체 내에 중복 키를 가질 수 없습니다.

당신이 찾고있는 정확하게 명확하지,하지만 아마도이 같은 뭔가를 갈 가장 좋은 것입니다 : 이것은 당신이 원하는 경우

{ 
"_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": [] 
}], 
} 

, 당신이 시도 할 수 있습니다 :

를 당신이 오직 측정 배열의 각 객체의 단일 문자열을 저장하는 거라면
User.findOneAndUpdate(
    { _id:req.body._id "sensors.sensor_name": req.body.sensor_name }, 
    { $push: { "sensors.0.measurements": { "time": req.body.time } } } 
); 

그리고 보조 노트로 는, 당신은 단지 전체 개체 { time: "value" } 대신 실제 값을 저장 할 수 있습니다. 이 방법으로 데이터를보다 쉽게 ​​처리 할 수 ​​있습니다.

희망이 도움이됩니다.