MongoDB,mongoose,在$ unwind数组后分组

时间:2017-08-01 20:13:20

标签: node.js mongodb mongoose

所以我有这个功能根据用户A的访问权限返回用户B数据:

get: (userToGet, userWithAccess, done) => {
        userModel
            .aggregate([
                { $match: { name: userToGet } }, // Match user
                { $unwind: '$decks' },           // Split decks to check seperatly
                {
                    $match: {
                        $or: [
                            { 'decks.users': userWithAccess.name },  // Check if user access
                            { 'decks.groups': { $in: userWithAccess.groups } } // Check if shared group access
                        ]
                    }
                },
                { $group: {
                    '_id': {
                        'name': '$name'
                    },
                    'decks': { $push: '$decks.name' }
                }}
            ])
            .exec((err, data) => { // Run
                done(err, data);   // Return data
            });
    }

如果用户有权访问甲板并返回甲板,并且从返回的数据中删除了他无法访问的甲板,则按预期工作。但是,如果用户无法访问任何卡组,则返回的数据为{}

我想将基本信息退回到甲板以外。因此,如果用户没有甲板访问权返回:

{
  _id: {
    'name: 'User B'
  },
  'decks': [] // empty array or no 'decks' property at all works
}

为什么$ filter $ project无效:

{ $match: { $or: [
                    { 'decks.users': userWithAccess.name },
                    { 'decks.groups': { $in: userWithAccess.groups }}
                ]}},
                { $project: {
                    decks: { $filter: {
                        input: '$decks',
                        as: 'deck',
                        cond: { $or: [
                            { $eq: ['$$deck.users', userWithAccess.name ]},
                            { '$$deck.groups': { $in: userWithAccess.groups }}
                        ]}
                    }}
                }}

导致此错误:(node:30398) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): MongoError: Unrecognized expression '$$deck.groups'

{ $match: { $or: [
                    { 'decks.users': userWithAccess.name },
                    { 'decks.groups': { $in: userWithAccess.groups }}
                ]}},
                { $project: {
                    decks: { $filter: {
                        input: '$decks',
                        as: 'deck',
                        cond: { $or: [
                            { $eq: ['$$deck.users', userWithAccess.name ]},
                            { $eq: ['$$deck.groups', userWithAccess.groups ]}
                        ]}
                    }}
                }}

除非$$deck.groups与提供的组数组完全相同,否则不起作用。不检查。

当我只想返回数组中的deck.name时,它返回整个deck对象。所以对象返回应该是:

{
  user: 'name',
  decks: ['deck1', 'deck2', ...],
  ...
}

但我得到了:

{
  user: 'name',
  decks: [{...}, {...}, ...],
  ...
}

这就是为什么我使用$ group和$ unwind,它返回的东西比$ project要多得多。

0 个答案:

没有答案