$ lookup在猫鼬中进行交叉收集查询

时间:2019-02-22 13:05:32

标签: mongodb mongoose

我正在建立一个问题数据库。我有三种模式,用户,问题和答复(答案)。我的问题从我只想查询用户尚未回答的问题开始。但是当我运行此查询时,我得到一个带有空回复数组的问题。我应该以某种方式填充它吗?这是我得到的地方:

查询:

let getQuestions = (req, res)=>{

    Question.aggregate([
        {
            $match: {isGlobal: true}
        },
        {
            $lookup: {
                from: 'Reply',
                localField: '_id',
                foreignField: 'questionID',
                as: 'replies'
            }
        },
        // {
        //     $match: {}
        // }
    ]).then(foundQuestions=> console.log(foundQuestions))
};

用户架构(简体):

const mongoose = require('mongoose');

const userSchema = mongoose.Schema({
    firstName: String,
    lastName: String,
    email: String,
    questionReplies: [
        {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Reply'
        }
    ],
}, {timestamps: true});

module.exports = mongoose.model('User', userSchema);

问题模式:

const mongoose = require('mongoose');

const questionSchema = mongoose.Schema({
    title: String,
    description: String,
    isGlobal: Boolean,
    options: [
        {
            number: Number,
            title: String,
        }
    ]
}, {timestamps: true});

module.exports = mongoose.model('Question', questionSchema);

回复架构:

const mongoose = require('mongoose');

const replySchema = mongoose.Schema({
    questionID: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Question',
        required: true
    },
    email: {type: String, required: true},
    answerID: {type: String, required: true},
    number: Number,
    title: String,
}, {timestamps: true});

module.exports = mongoose.model('Reply', replySchema);

我的回复集合中包含以下文档:

"questionID" : ObjectId("5c6f6867cbff9c2a9004eb6d")

我有一个与此ID有关的问题:

"_id" : ObjectId("5c6f6867cbff9c2a9004eb6d"),

(也欢迎任何有关改进数据库设计的意见)。

2 个答案:

答案 0 :(得分:0)

尝试以下方法:

let getQuestions = (req, res)=>{
    Question.aggregate([
        {
            $match: {isGlobal: true}
        },
        {
            $lookup: {
                from: 'Reply',
                localField: '_id',
                foreignField: 'questionID',
                as: 'replies'
            }
        },
        {
             $match: { "replies": { $eq: [] } }
        }
    ]).then(foundQuestions=> console.log(foundQuestions))
};

因此您将收到没有任何答复的问题。

答案 1 :(得分:0)

我解决了我的问题,并在此处发布以供将来参考。

from中使用的$lookup字段是指mongodb创建的集合名称,而不是猫鼬中使用的型号名称。因此正确的查询是:

$lookup: {
    from: 'replies',
    localField: '_id',
    foreignField: 'questionID',
    as: 'replies'
}

然后我添加了

{
    $match: { "replies": { $eq: [] } }
}

仅查找没有答案的问题。