我正在MEAN.js样板上开发一些应用程序,但遇到了一个我自己无法解决的问题:(
我有以下数据库方案:
var UserSchema = new Schema({
profession: {
type: Schema.ObjectId,
ref: 'Profession'
},
game: {
type: Schema.ObjectId,
ref: 'Game'
}
};
var ProfessionSchema = new Schema({
assignedTaskCategories: [{
type: Schema.ObjectId,
ref: 'TaskCategory'
}]
});
var TaskCategorySchema = new Schema({
professions: [{
type: Schema.ObjectId,
ref: 'Profession'
}],
assignedToGame: {
type: Schema.ObjectId,
ref: 'Game'
}
});
var TaskSchema = new Schema({
game: {
type: Schema.ObjectId,
ref: 'Game'
},
inCategories: [{
type: Schema.ObjectId,
ref: 'TaskCategory'
}]
});
现在,我想获取所有任务,这些任务在
inCategories
中与用户的行业taskCategories数组相同。我已经试过了,但是什么也没返回
Profession.find({ _id: req.user.profession }).exec(function(err, userCategories) {
if(err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
Task.find({ game: req.user.game, inCategories: userCategories.assignedTaskCategories}).exec(function(err, tasks) {
if(err) {
return res.status(400).sed({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(tasks);
}
});
}
});
有人可以帮我吗? :)如果我的方法不好,请告诉我正确的方法如何解决它:)
编辑
我们不能使用$ setEquals,因为数组不一样,请考虑以下示例:
专业程序员能够解决以下任务类别:
编程,演示,洗碗
专业秘书能够解决以下任务类别:
介绍,洗碗
然后,我们将创建一个任务,将其分配给以下类别:洗碗,因此职业
assignedCategories
数组更大,不等于任务的inCategories
数组。 最佳答案
尝试使用aggregation framework,在其中使用$setEquals
运算符比较数组。在以下管道中,操作员确定Tasks的inCategories
数组和assignedTaskCategories
数组是否包含相同的元素:
Profession.find({ _id: req.user.profession }).exec(function(err, userCategories) {
if(err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
var pipeline = [
{
"$match": { "game": req.user.game }
},
{
"$project": {
"game": 1,
"inCategories": 1,
"sameElements": {
"$setEquals": [ "$inCategories", userCategories[0].assignedTaskCategories ]
}
}
},
{
"$match": { "sameElements": true }
}
];
Task.aggregate(pipeline)
.exec(function (err, tasks){
if(err) {
return res.status(400).sed({
message: errorHandler.getErrorMessage(err)
});
} else {
res.json(tasks);
}
});
}
});