【问题标题】:How to join data from two collections in MongoDB?如何连接来自 MongoDB 中两个集合的数据?
【发布时间】:2015-07-22 02:08:28
【问题描述】:

我正在 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 中有一些元素,与用户的职业任务类别数组相同。 我试过了,但它什么也没返回

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数组。

【问题讨论】:

  • 但是在您最初的问题中,您提到 现在我想获取所有具有相同 inCategories 的任务??这如何不转化为相同的数组?您能否更具体地说明您要在这里实现的目标?
  • 对不起,我的错误..我的英语不是很好......但我想我有一个解决方案:Task.find({ game: req.user.game, inCategories: { $in: profession[0].assignedTaskCategories }})

标签: javascript mongodb express mongoose


【解决方案1】:

尝试使用 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);
                }
        });

    }
});

【讨论】:

  • 感谢您的回答。我试过你的代码,但它不起作用:(如果我尝试评论$project代码块,它将返回匹配游戏中的所有任务(如预期的那样)。但现在它返回空数组,没有结果:(
  • 也许是这个问题? console.log(userCategories[0].assignedTaskCategories) 输出:["55365075f9e809c8285d99a3","5550a9604b24bcdc1b88cc76"] console.log(tasks[0].inCategories 输出:[ 5550a9604b24bcdc1b88cc76 ] 第二个数组的 id 没有引号
  • @user3216673 显然返回的数组没有相同的元素,因此新字段 sameElements 具有 false 值,因为 $setEquals 运算符正在比较数组 [ 5550a9604b24bcdc1b88cc76 ]["55365075f9e809c8285d99a3","5550a9604b24bcdc1b88cc76"]
  • 又过了 2 小时,我完全迷路了,因为 ... 1) console.log(tasks[0].inCategories); 总是返回一个 id 不带引号的数组 || 2)console.log(profession[0]) 返回一个属性为assignedTaskCategories 的职业对象,其中是一个id 不带引号的数组|| 3) console.log(profession[0].assignedTaskCategories); 返回数组,id 用引号括起来...该死的怎么了?!
猜你喜欢
  • 2021-11-04
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-31
  • 2017-12-10
相关资源
最近更新 更多