2017-03-03 15 views
0

ユーザーIDの配列にIDを持つすべてのユーザーを取得する方法を教えてください。 私の問題は、私はグループのコレクションを持っている、各グループはユーザーと呼ばれるuserIDsの配列を持っています、これらのユーザーはグループに属しています、私はそのユーザーIDの配列からユーザーオブジェクトを取得する方法を知る必要があります?MeteorJsユーザーIDの配列を持つすべてのユーザーを検索

クライアント

export default createContainer((props) => { 
    let user = Meteor.users.findOne(Meteor.userId()) 
    let groupsSub = Meteor.subscribe('groups') 

    if (user) { 
    let code = user.profile.selectedGroup 
    let group = Groups.findOne({code}) 
    return { 
     ready: groupsSub.ready(), 
     group, 
     users: Meteor.users.find({_id: {$in: group.users}}).fetch() 
    } 
    } 

    return {} 
}, HomePage) 

サーバ

Meteor.publish('groups', function() { 
return Groups.find({ 
    users: { 
    $elemMatch: { $eq: this.userId } 
    } 
}) 
}) 

、これは私が取得しようとしているところであるユーザーも、私は、フロントエンド

反応使ってい

render() { 
    if (this.props.ready) { 
    let group = this.props.group 
    let users = this.props.users 
    console.log(users) 

    return (
     <div className='c-fit-group'> 
     <div className='c-fit-group__header'> 
      <h1>{group.name}</h1> 
     </div> 
     </div> 
    ) 
    } 

    return <div>Loading...</div> 
    } 
} 

I c onsole.log group.users私はこの enter image description here

を取得し、私は、ユーザーをCONSOLE.LOGときあなたは、単に(私はそれがかどう伝えるのトラブルを抱えているユーザーIDの配列を持っている場合、私はこの enter image description here

+0

あなたはこれまでに何を試しましたか? – jordanwillis

答えて

3

を取得しますあなたが解決しようとしている問題)、$ in演算子を使うことができます。例えば

let userResults = Meteor.users.find({_id: {$in: userIds}}).fetch(); 

を更新:だけではなく、カーソルの結果を得るために

let userIds = ['abc', 'def', 'hgi']; 
let userCursor = Meteor.users.find({_id: {$in: userIds}}); 

クライアント上のすべてのユーザーを取得していないについてあなたのコメントから

を、あなたどこかがあります実際にユーザーを公開していますか?私はあなたが欠けている部分だと思う。

などのパブリッシュから複数のカーソルを返すことができます。

Meteor.publish('groups', function() { 
    let groupsCursor = Groups.find({ 
     users: { 
      $elemMatch: { $eq: this.userId } 
     } 
    }); 

    // find these from... ??? 
    let userIds = []; 

    let usersCursor = Meteor.users.find({_id: {$in: userIds}}); 

    return [groupsCursor, usersCursor]; 
}); 
+0

私はこれを行うときにオブジェクトを戻すlocalCollection.Cursor私はアイデアを持っていません:P私は私にユーザーオブジェクトの配列を与えると期待していますか? –

+0

@GavynCaldwell、いいえ、find()は、必要に応じて、反復可能なカーソルを返します。結果だけが必要な場合は、fetchを呼び出すこともできます。答えを例で更新します。 – zim

+0

大丈夫私はちょうどユーザーの1人を返す.fetch()を使ってみました。アレイに少なくとも2人のユーザーがいます –

1

コレクション全体ですべてのユーザーを検索している場合、以下の集計を試すことができます。

最初の段階では、各文書内のすべての一致がuserIdsであり、その後には$groupが続き、コレクション全体で異なるユーザーを取得します。

db.collection.aggregate([{ 
    $project: { 
     userIds: { 
      $setIntersection: ["$userIds", [1, 2, 3]] 
     } 
    } 
}, { 
    $unwinds: "$userIds" 
}, { 
    $group: { 
     $id: null, 
     userIds: { 
      $addToSet: "$userIds" 
     } 
    } 
}]) 
関連する問題