sails.js 多对多查询
sails.js many to many query
我正在尝试构建一个聊天应用程序。我有一个多对多关联。一个房间有很多用户。一个用户可以拥有多个房间。我正在尝试检索同时具有用户 A (fromUserId) 和用户 B (toUserId) 的房间。我正在尝试这样的事情,但我知道这是不正确的:
Room.find().populate('users', { where:{ id: [fromUserId, toUserId] } }).exec(function(err, rooms){
console.log(rooms);
});
这里的问题是 returns 任何 users.id = fromUserId or toUserId 的房间。我在这里需要的是一个 and 查询。
感谢任何帮助。 (:
即使使用原始 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(...);
});
});
您可以使用 async.auto
使它更优雅,并且不要忘记处理您的错误!
如果您使用 Mongodb 水线,您可以使用 $in
Room.native(function(err, collection) {
collection.find({
"users" : {
$in : [fromUserId, toUserId]
}
}, function(err, results) {
if (err) return res.badRequest(err);
console.dir(results)
});
});
缺点是它的原生 mongodb 特性,你不能在其他数据库中使用它。
我正在尝试构建一个聊天应用程序。我有一个多对多关联。一个房间有很多用户。一个用户可以拥有多个房间。我正在尝试检索同时具有用户 A (fromUserId) 和用户 B (toUserId) 的房间。我正在尝试这样的事情,但我知道这是不正确的:
Room.find().populate('users', { where:{ id: [fromUserId, toUserId] } }).exec(function(err, rooms){
console.log(rooms);
});
这里的问题是 returns 任何 users.id = fromUserId or toUserId 的房间。我在这里需要的是一个 and 查询。
感谢任何帮助。 (:
即使使用原始 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(...);
});
});
您可以使用 async.auto
使它更优雅,并且不要忘记处理您的错误!
如果您使用 Mongodb 水线,您可以使用 $in
Room.native(function(err, collection) {
collection.find({
"users" : {
$in : [fromUserId, toUserId]
}
}, function(err, results) {
if (err) return res.badRequest(err);
console.dir(results)
});
});
缺点是它的原生 mongodb 特性,你不能在其他数据库中使用它。