2015-04-02 2 views
1

Я пытаюсь создать приложение для чата. У меня есть ассоциация «многие-ко-многим». В комнате много пользователей. И у пользователя может быть много комнат. Я пытаюсь получить комнату, в которой есть как пользователь A (fromUserId), так и пользователь B (toUserId). Я пытаюсь что-то вроде этого, но я знаю, что это не правильно:sails.js много для многих запросов

Room.find().populate('users', { where:{ id: [fromUserId, toUserId] } }).exec(function(err, rooms){ 
    console.log(rooms); 
}); 

Проблема здесь состоит в том, что она возвращает все номера, которые users.id = fromUserId или toUserId. Здесь мне нужен запрос и.

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

+0

какая база данных вы используете? –

+0

Ryan Wu mongodb with waterline ORM – holyxiaoxin

ответ

3

Если вы используете MongoDB с ватерлинии, вы можете использовать $ в

Room.native(function(err, collection) { 
collection.find({ 
    "users" : { 
     $in : [fromUserId, toUserId] 
    } 
    }, function(err, results) { 
    if (err) return res.badRequest(err); 
    console.dir(results) 
    }); 
}); 

disadvant возраст заключается в том, что его собственная функция mongodb, вы не можете использовать ее в другой базе данных.

+1

Спасибо! Это волшебство, которое я ищу. – holyxiaoxin

2

Вы бы трудно нажиму, чтобы сделать это даже с сырым SQL Лучше всего, чтобы получить все номера, которые каждый пользователь, и затем получить пересечение:.

// Get the fromUser and their rooms 
User.findOne(fromUserId).populate('rooms').exec(function(err, fromUser) { 
    // Get the toUser and their rooms 
    User.findOne(toUserId).populate('rooms').exec(function(err, toUser) { 
    // Get the IDs of the rooms they are both in 
    var fromUserRoomIds = _.pluck(fromUser.rooms, 'id'); 
    var toUserRoomIds = _.pluck(toUser.rooms, 'id'); 
    var sharedRoomIds = _.intersection(fromUserRoomIds, toUserRoomIds); 
    // Find those rooms 
    Room.find({id: sharedRoomIds}).exec(...); 
    }); 
}); 

You могли бы сделать это более элегантно, используя async.auto, и не забудьте обработать ваши ошибки!

+0

Я тоже это сделал, но я надеялся на магию в ORM. Благодарю. (: – holyxiaoxin

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