私はこのスキーマを有する文書のみ特定のサブ文書/フィールドを返す、「ユーザ」と「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の集計システムを理解していない:
これは私がしようとしていたものです。
どちらも動作しません。最初のものはエラーがあります。あなたの行方不明の '{'の' $と 'の後、' $と:[] 'は$と配列を実行しても動作しない場合、すべてのデッキと本を返します。あなたの2番目のものは問題なくセットアップされていますが、私はこのエラーが発生します: 'MongoError:不明な最上位演算子:$ decks.users'' $ unwind'の後で壊れている理由はわかりません。それは正しいはずです。 – Drew
@Drewは、更新された答えを試してください。私はデッキから$を取り除きました。試合を探して、それを稼働させました。すべてのフィールドが返されますが、後に "$ project"フィルタを追加して返すものを指定できます。 – Nuspeed1
あなたが提供したそのアップデートは、少し静かに助けてくれました。これで、一致するユーザーのデッキだけが返されます!今では、 '{$ match:{" book.users ":" access_user "}}'を追加して本を拡張するかどうかを調べるようにしました(これは空の配列を返しました)。私の例では、そうすべきではありませんが、ユーザーがBookを読むための "access_user"パーミッションを与えていれば、それをチェックして返すか返さないといけません。私はまた、不要な情報のパス、トークン、組織、グループ、ユーザー、_id、__vなどをフィルタリングする必要があります。 – Drew