2017-08-08 19 views
0

Mongoインスタンスから、特定のアカウントIDのすべてのユーザーを表示するデータを取得しようとしています。ユーザーが複数のアカウントの一部にすることができますので、私は現在、私のMongoのモデルのためにこのような構造を持っている:MongoDBは外部キーに2つのコレクションを集約します

UserModel:

username: { 
     type: String, 
     required: true, 
     unique: true, 
     lowercase: true 
    }, 
    name: { 
     type: String, 
     required: true 
    }, 
    password: { 
     type: String, 
     required: true 
    }, 
    email: { 
     type: String, 
     required: true, 
     unique: true 
    }, 

をUsersToAccountModel:

{ 
    user: { 
     type: Schema.Types.ObjectId, 
     ref: 'users' 
    }, 
    userGroup: { 
     type: Schema.Types.ObjectId, 
     ref: 'userGroups' 
    }, 
    account: { 
     type: Schema.Types.ObjectId, 
     ref: 'accounts' 
    }, 
    default: { 
     type: Boolean, 
     default: null 
    } 
} 

UsersToAccountモデルコレクションがのObjectIdを保持していますそのフィールドにuser、account、およびuserGroupの名前があるので、リンクコレクションとして機能します。

UsersToAccountコレクション内の指定されたアカウントIDと一致するすべてのユーザーIDに対して、そのIDを取得してユーザーテーブルを照会して返します。 MySQLでクエリは次のようになります。

SELECT * userToAccountsのU2Aの左からユーザーを登録しようU ON u.id = u2a.userId WHERE u2a.account = $ accountIdを

誰もがここで私を助けることができる、私は疲れて凝集を持っていますが?私は非常に遠くになっていません。ここで

は、私のこれまで機能していない試みです:

{ 
    $lookup: { 
     from: <collection to join>, 
     localField: <field from the input documents>, 
     foreignField: <field from the documents of the "from" collection>, 
     as: <output array field> 
    } 
} 

は、だから私はあなたが必要だと思う:

答えて

0

まず

const users = await this.userToAccountModel.aggregate(
       { 
        $match: { account: requestVars.account }, 
       }, 
       { 
        $lookup : { from: "users", localField: "_id", as: "userData", foreignField: "user"} 
       } 
      ); 

おかげで、$lookupステージは、次の構文を持っていますlocalFieldforeignFieldの値を入れ替えます。

第2に、aggregate()は配列が必要です。

const users = await this.userToAccountModel.aggregate([ 
    { 
     $match: { account: requestVars.account }, 
    }, 
    { 
     $lookup : { from: "users", localField: "user", foreignField: "_id", as: "userData" } 
    } 
]); 
関連する問題