2017-07-22 71 views
0

我有此架構:mongodb的,mongoosejs返回文件和只有特定的子文檔/字段

{ 
    user: { type: String, required: true }, 
    pass: { type: String, required: true }, 
    tokens: [String], 
    book: { 
     cards: [{ 
      id: String, 
      copies: Number 
     }], 
     groups: [String], 
     users: [String], 
     orgs: [String], 
     stats: { 

     } 
    }, 
    decks: [{ 
     name: String, 
     description: String, 
     cards: [{ 
      id: String, 
      copies: Number 
     }], 
     groups: [String], 
     users: [String], 
     orgs: [String], 
     stats: { 

     } 
    }], 
    groups: [String], 
    orgs: [String] 
} 

我有兩個提供的參數:「用戶」和「access_user」,陣列schema.book.users[]可以或可以不包含「access_user 」。數組schema.decks[i].users[]可能包含或不包含'access_user'。例如:

{ 
    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

兩者都不工作,你的第一個有錯誤。在缺少'{'後'$和'後面,但它應該是'$和:[]'當我做$和數組時它不起作用,它會返回所有的套牌和書。你的第二個設置沒有問題,但是當我運行它時,我得到這個錯誤:'MongoError:未知的頂級操作符:$ decks.users'這是'$ unwind'後面的分支不知道爲什麼,我查了$ unwind並且它應該是正確的。 – Drew

+0

@Drew嘗試更新的答案。當我找到一個匹配並使其工作時,我從decks.users中刪除了$。它將返回所有字段,但可以在它後面追加一個「$ project」過濾器並指定要返回的內容。 – Nuspeed1

+0

您提供的更新有助於安靜一點。現在只能用一個匹配的用戶返回套牌!現在我試圖通過附加'{$ match:{「book.users」:「access_user」}}'來查看是否應該返回該書(這返回一個空數組)。在我的例子中,它不應該,但是,如果用戶已經給了「access_user」讀取Book的權限,我需要檢查並返回或不返回它。我還需要過濾出不需要的信息'pass,令牌,組織,用戶,_id,__v等'。 – Drew

相關問題