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的總系統。
兩者都不工作,你的第一個有錯誤。在缺少'{'後'$和'後面,但它應該是'$和:[]'當我做$和數組時它不起作用,它會返回所有的套牌和書。你的第二個設置沒有問題,但是當我運行它時,我得到這個錯誤:'MongoError:未知的頂級操作符:$ decks.users'這是'$ unwind'後面的分支不知道爲什麼,我查了$ unwind並且它應該是正確的。 – Drew
@Drew嘗試更新的答案。當我找到一個匹配並使其工作時,我從decks.users中刪除了$。它將返回所有字段,但可以在它後面追加一個「$ project」過濾器並指定要返回的內容。 – Nuspeed1
您提供的更新有助於安靜一點。現在只能用一個匹配的用戶返回套牌!現在我試圖通過附加'{$ match:{「book.users」:「access_user」}}'來查看是否應該返回該書(這返回一個空數組)。在我的例子中,它不應該,但是,如果用戶已經給了「access_user」讀取Book的權限,我需要檢查並返回或不返回它。我還需要過濾出不需要的信息'pass,令牌,組織,用戶,_id,__v等'。 – Drew