所以我有这个功能根据用户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要多得多。