簡體   English   中英

如何在MongoDB中聯接來自兩個集合的數據?

[英]How to join data from two collections in MongoDB?

我正在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陣列。

嘗試在使用$setEquals運算符比較數組的地方使用聚合框架 在下面的管道時,操作者確定是否任務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);
                }
        });

    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM