Mongoose对填充和嵌套查询的精简用法

时间:2017-12-06 19:48:54

标签: javascript node.js mongoose

我在使用MongoDB的Node.js中编写应用程序。我选择了MongooseJS来处理我的数据库查询。

我有两个相互引用的集合(Room是'上级'集合,DeviceGroups包含在Room集合中。

我有一个查询,它会从Room集合中获取所有房间的列表,填充deviceGroups字段(RoomsDeviceGroup集合的引用)和在它内部有一个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);
    });
});

1 个答案:

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