我有这个架构:
{
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]
}
我有两个提供的参数:'user'和'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''admin_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的聚合系统。
答案 0 :(得分: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"}})