Mongoose-mongoDB高级查询连接

时间:2015-07-24 11:45:43

标签: node.js mongodb mongoose mongodb-query

我的数据库中有两个模型,Room模型和Block模型

会议室架构

var RoomSchema = new Schema({
  name: String,
  floor: { type: Number, min: 0},
  capacity: { type: Number, min: 0},
  free: { type: Number, min: 0},
  block: {type: mongoose.Schema.Types.ObjectId, ref: 'Block'}
});

块架构

var BlockSchema = new Schema({
  name: String,
  type: Boolean, // 0->man, 1->woman
  rooms: [{type: mongoose.Schema.Types.ObjectId, ref: 'Room'}]
});

我想检索属于类型为false的块的所有房间(男人的房间), 所以如果我在pseduo sql中写这个就像

select * from rooms
left join blocks on blocks.id = romms.block_id
where blocks.type = false;  

在查询返回后立即过滤房间实体,因为它会改变分页数据而无法工作。

任何帮助表示赞赏!!

2 个答案:

答案 0 :(得分:2)

这必须在mongodb中作为两个单独的查询来完成,因为它不是关系数据库。

首先执行块查询:

db.blocksCollection.find({type : false})

这将返回false类型的数组。

这可以使用$in运算符查询这些区域中房间的房间集合:http://docs.mongodb.org/manual/reference/operator/query/in/

db.roomsCollection.find({block : { $in : [block1,block2,etc...]}})

答案 1 :(得分:1)

当您使用Mongoose的 populate 方法时,您可以使用单个查询执行此操作,该方法是使用其他集合中的文档自动替换文档中的指定路径的过程( S)。例如,您可以使用查询构建器填充块的房间:

var query = { "type": false };
Block.find(query)
     .select('-_id -name -type')
     .poulate('rooms')
     .exec(function (err, res){
        console.log('The first room is %s', res[0].rooms[0].name);
     })