我在使用MongoDB的Node.js中编写应用程序。我选择了MongooseJS来处理我的数据库查询。
我有两个相互引用的集合(Room
是'上级'集合,DeviceGroups
包含在Room
集合中。
我有一个查询,它会从Room
集合中获取所有房间的列表,填充deviceGroups
字段(Rooms
对DeviceGroup
集合的引用)和在它内部有一个map
方法,它遍历Room
集合中的每个房间,并为每个房间提出另一个查询 - 它会在deviceGroups
集合中查找任何DeviceGroup
在map方法中引用当前房间的。
我的目标是返回所有房间的列表,其中deviceGroups
字段填入实际数据,而不仅仅是参考资料。
我在查询后(then
方法内)获取的是Mongoose文档。整个算法用作GET
方法的处理程序,因此我需要一个纯JavaScript对象作为响应。
我想要实现的主要目标是将所有查询和人口内部的结果作为纯javascript对象获取,因此我可以创建一个响应对象并发送它(我不想发送db返回的所有内容,因为不是这种情况需要所有数据)
编辑:
我很抱歉,我删除了我的代码并没有意识到。
我目前的代码如下:
架构:
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 :(得分: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);
})