【问题标题】:Mongoose-mongoDB advanced query joinsMongoose-mongoDB 高级查询连接
【发布时间】:2015-10-15 01:56:54
【问题描述】:

我的数据库中有两个模型,房间模型和块模型

房间架构

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;  

在查询返回后过滤房间实体将不起作用,因为它会更改分页数据。

感谢任何帮助!

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    这必须在 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...]}})
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • populate() 在使用 Mongoose 时是一个更好的解决方案,所以 +1。虽然从技术上讲,它不是“一个单一的查询”,它只是看起来像一个。在内部,Mongoose 将与接受的答案相同。
      • @robertklep 感谢您的启发,从技术上讲,它确实相当于上面 Mongoose 引擎盖下的两个查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多