2016-03-07 76 views
1

我有兩個集合一個包含用戶配置文件,另一個包含用戶朋友userFriend包含陣列呼叫朋友,它將包含該特定用戶的朋友。這兩個集合之間的關係是user_id。我剛剛寫了一個函數來獲取一個用戶朋友配置文件,它正在工作。但我想知道是否還有其他更好的方法,而不是從一個接一個地檢索它。請找到下面的方法。Metero獲取數據形式的兩個集合映射ID's

import UserFriends from 'TruthHurts/collections/UserFriends'; 
import UserProfile from 'TruthHurts/collections/UserProfile'; 

getUserFriends: function(userId){ 
    var resutls= [],userProfiles; 
    var UserFriendsList = UserFriends.findOne({userId: userId}); 
    for(var i = 0; i < UserFriendsList.friends.length; i++){ 
     userProfiles = UserProfile.findOne({userId: UserFriendsList.friends[i].friend_id}); 
     if(userProfiles){ 
     resutls.push(userProfiles); 
     } 
    } 
    return resutls; 
    } 

回答

0

而不是使用一個for迴路和單獨的查詢每個id的,我會用MongoDB的內置$in操作:

getUserFriends: function(userId){ 
    var UserFriendsList = UserFriends.findOne({ 
     userId: userId 
    }); 

    // To extract friend_id's from friends array and store it in such a way that: 
    // UserFriendsList.friends = ["1","2","3",...] 
    UserFriendsList.friends.forEach(function(each, index, array) { 
     array[index] = each.friend_id; 
    }); 

    var userProfiles = UserProfile.find({ 
     _id: { 
     $in: UserFriendsList.friends // $in matches against every _id in friends array 
     } 
    }).fetch(); 

    return userProfiles; 
} 

這種方法應該是比使用for循環和個人findOne查詢更好。參考見SO post