mongodb,mongoosejs返回文档,只返回某些子文档/字段

时间:2017-07-22 00:59:33

标签: mongodb mongoose

我有这个架构:

{
    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的聚合系统。

1 个答案:

答案 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"}})