2017-07-22 3 views
0

私はこのスキーマを有する文書のみ特定のサブ文書/フィールドを返す、「ユーザ」と「access_user」をschema.book.users[]がまたは含んでも含まなくてもよい配列を「access_user '配列schema.decks[i].users[]には 'access_user'が含まれていてもいなくてもかまいません。例:のMongoDB、mongoosejsは

{ 
    user: 'bob', 
    pass: 'secret', 
    tokens: ['8ht490g'], 
    book: { 
     cards: [...], 
     groups: [...], 
     users: ['NOPE'], 
     orgs: [...], 
     stats: { 
      ... 
     } 
    }, 
    decks: [{ 
     name: 'deck1', 
     description: ..., 
     cards: [...], 
     groups: [...], 
     users: ['access_user'], 
     orgs: [...], 
     stats: { 
      ... 
     } 
    }, 
    { 
     name: 'deck2', 
     description: ..., 
     cards: [...], 
     groups: [...], 
     users: ['NOPE'], 
     orgs: [...], 
     stats: { 
      ... 
     } 
    }], 
    groups: [...], 
    orgs: [...] 
} 

比較ユーザー 'bob' 'access_user'を使用します。

私はお返しにこれをしたい:

{ 
    user: 'bob', 
    decks: [{ 
     name: 'deck1', 
     description: ..., 
     cards: [...] 
    }] 
} 

私はいくつかのことを試してみましたが、何も動作しているようだありません。 model.find()は私が必要とするものは十分に複雑ではありません。集約は実際には唯一の方法です。私はそれをどのように構築するか分かりません。

model.aggregate([ 
    { $match: { user: 'bob' } }, 
    { $project: { 
     'book.users': { $match: 'access_user' } 
    }}, 
    { $project: { 
     'decks.users': { $match: 'access_user' } 
    }} 
]); 

を、私はこれのどれも正しくありませんかなり確信している、しかし、私は完全にMongoDBの集計システムを理解していない:

これは私がしようとしていたものです。

答えて

1

集約はかなり複雑ですが、基本的には応答をパイプします。試してみてください:

model.aggregate([ 
    { $match: { 
     $and: // match multiple 
       {'user': 'bob'}, 
       {'deck.users': 'access_user' } 
      } 
    }, 
    {$project:{ // render each match in this format. output an array. 
     "user": 1, 
     "decks": 1 
    }} 
]) 

これがうまくいかない場合は、この方法を試してみてください。各コマンドを理解できるようにコメントが追加されました。 が更新されました。

model.aggregate(
    {$match: {'user':'bob'}}, 
    {$unwind: "$decks"}, 
    {$match: {"decks.users":"access_user"}}) 
+0

どちらも動作しません。最初のものはエラーがあります。あなたの行方不明の '{'の' $と 'の後、' $と:[] 'は$と配列を実行しても動作しない場合、すべてのデッキと本を返します。あなたの2番目のものは問題なくセットアップされていますが、私はこのエラーが発生します: 'MongoError:不明な最上位演算子:$ decks.users'' $ unwind'の後で壊れている理由はわかりません。それは正しいはずです。 – Drew

+0

@Drewは、更新された答えを試してください。私はデッキから$を取り除きました。試合を探して、それを稼働させました。すべてのフィールドが返されますが、後に "$ project"フィルタを追加して返すものを指定できます。 – Nuspeed1

+0

あなたが提供したそのアップデートは、少し静かに助けてくれました。これで、一致するユーザーのデッキだけが返されます!今では、 '{$ match:{" book.users ":" access_user "}}'を追加して本を拡張するかどうかを調べるようにしました(これは空の配列を返しました)。私の例では、そうすべきではありませんが、ユーザーがBookを読むための "access_user"パーミッションを与えていれば、それをチェックして返すか返さないといけません。私はまた、不要な情報のパス、トークン、組織、グループ、ユーザー、_id、__vなどをフィルタリングする必要があります。 – Drew