2015-07-24 4 views
0

У меня есть две модели в моей базе данных, модель номер и блок моделиМангуст-MongoDB расширенный запрос соединяет

Номер схемы

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

Я хотел бы получить все комнаты, которые принадлежат к блоку, где тип является ложным (комнаты для мужчин),так, если бы я должен был написать в pseduo SQL было бы как

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

фильтрации номера объектов только после возвращения запроса, не будет работать, потому что это изменит данные нумерации страниц.

Любая помощь приветствуется!

ответ

1

Это должно быть сделано как два отдельных запроса в mongodb, поскольку это не реляционная база данных.

Сначала сделайте запрос блоков:

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

Это возвращает массив блоков типа ложной.

Это может быть использован для запроса сбора комнаты для помещений в этих блоках, используя $in оператор: http://docs.mongodb.org/manual/reference/operator/query/in/

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

благодаря человеку вы спасли мою жизнь – benaich

1

Вы можете сделать это с помощью одного запроса при использовании метода 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); 
    }) 
+1

'Заселите()' является лучшим решением при использовании Mongoose, так +1. Хотя технически это не _ «один единственный запрос» _, он просто выглядит как один. Внутренне Mongoose будет делать то же самое, что и принятый ответ. – robertklep

+0

@robertklep Спасибо за просвещение, действительно технически это эквивалентно двум запросам выше под мангустским капюшоном. – chridam

Смежные вопросы