2017-12-06 1 views
1

MongoDB를 사용하는 Node.js에 앱을 코딩하고 있습니다. 내 DB 쿼리를 처리하기 위해 MongooseJS를 선택했습니다.인구가 많고 중첩 된 쿼리로 몽구스가 희박하게 사용됩니다.

나는 서로를 참조하는 두 컬렉션이 있습니다 (Room은 '상위'컬렉션이고 DeviceGroupsRoom 컬렉션에 들어 있음).

I Room 컬렉션 모든 객실의 목록을 가져옵니다 쿼리가합니다 (Rooms 참조 DeviceGroup에 모음입니다) deviceGroups 필드를 채우고는에있는 모든 방을 통해가는 map 방법이 내부에있다 Room 컬렉션을 찾고 모든 방에서 다른 쿼리를 만듭니다.지도 메서드의 현재 공간을 참조하는 컬렉션의 deviceGroups을 찾습니다.

나의 목표는 deviceGroups 필드의 모든 객실의 목록을 참조뿐만 아니라 실제 데이터로 채워지는 것입니다.

쿼리 후 (then 메서드 내에서) 얻는 것은 몽구스 문서입니다. 전체 알고리즘은 GET 메서드의 핸들러로 사용되므로 순수 JavaScript 객체가 필요합니다.

달성하고자하는 주된 목표는 순수한 자바 스크립트 객체로 모든 쿼리와 인구의 결과를 얻는 것입니다. 따라서 응답 객체를 생성하고 전송할 수 있습니다 (db가 반환하는 모든 것을 보내려하지 않습니다. 모든 데이터는이 경우)

편집에 필요하지 : 정말 미안 해요

, 내 코드와 didnt가 그것을 실현 삭제했다.

내 현재 코드는 다음과 같습니다 :

스키마 :

const roomSchema = Schema({ 
    name: { 
     type: String, 
     required: [true, 'Room name not provided'] 
    }, 
    deviceGroups: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'DeviceGroup' 
    }] 
}, { collection: 'rooms' }); 

const deviceGroupSchema = Schema({ 
    parentRoomId: { 
     type: Schema.Types.ObjectId, 
     ref: 'Room' 
    }, 
    groupType: { 
     type: String, 
     enum: ['LIGHTS', 'BLINDS', 'ALARM_SENSORS', 'WEATHER_SENSORS'] 
    }, 
     devices: [ 
     { 
      type: Schema.Types.ObjectId, 
      ref: 'LightBulb' 
     } 
    ] 
}, { collection: 'deviceGroups' }); 

쿼리 : 당신이 혼란

app.get('/api/id/rooms', function(req, res) { 
    Room.find({}).populate('deviceGroups').lean().exec(function(err, parentRoom) { 
     parentRoom.map(function(currentRoom) { 
      DeviceGroup.findOne({ parentRoomId: currentRoom._id }, function (err, devices) { 
       return devices; 
      }); 
     }); 
    }).then(function(roomList) { 
     res.send(roomList); 
    }); 
}); 

답변

0

. 여기 간단하고 효과적인 코드 스 니펫

Room.findById(req.params.id) 
.select("roomname") 
.populate({ 
    path: 'deviceGroup', 
    select: 'devicename', 
    model:'DeviceGroups' 
    populate:{ 
     path: 'device', 
     select: 'devicename', 
     model:'Device' 
     } 
}) 
.lean() 
.exec((err, data)=>{ 
    console.log(data); 
}) 
+0

정말 죄송합니다. 현재 코드를 게시하는 것을 잊어 버렸습니다. 현재 –

+0

이 현재 코드에 리플 렉팅하는 답변으로 추가됩니다. 지도 내부의 데이터베이스를 쿼리하는 것은 좋지 않습니다. 동일한 일을 채우십시오. 몽구스 인구에 대해 자세히 알아보십시오. 당신은 건너 뛸 수 있습니다 2 중첩 된 인구가 – shivshankar

+0

고마워요! 내 필요에 맞게'populate' 메소드의 호출을 변경했지만 구현이 완벽하게 작동합니다! populate 메소드에 대한 몽구스의 문서를 읽었지 만, 나에게는 여전히 혼란 스러울 정도였다. 모든 것이 이제 완벽하게 분명합니다. –

관련 문제