【问题标题】:using if conditions to summon appropriate stages in aggreagations使用 if 条件在聚合中调用适当的阶段
【发布时间】:2020-03-27 22:16:10
【问题描述】:

下面是一个虚构的语法,我希望它可用,这样我就可以使用 . 我有一个课程集合,每门课程都有一个会话数组作为子文档 我想根据我的用户在搜索时查询参数来获取课程,这样如果有人要求特定老师的课程,我会在我的 $match 阶段使用它,如果不只是找到所有老师的所有课程,同样适用于主题和状态,如果它们被定义,则使用它们,如果不忽略它们并找到所有可能的。

如果在 mongo 或聚合中有一个关键字我可以使用并且它知道它可以找到所有类似 * 或正则表达式语法的东西,那么还有另一个过程

我也遇到了 $cond 关键字,但在这里与我的期望不符。

app.get('/sessions',(req, res)=>{
    const teacher = req.query.teacherId
    const subject = req.query.subjectId
    const status = req.query.statusId

    Course.aggregate([
       if(teacher) {$match:{teacher:teacher}},
       if(subject) {$match:{subject:subject}},
       if(status)  {$match:{status:status}}
    ]).then(sessions=>res.json(sessions))
    .catch(err=>res.json(err))

})

不确定这是否有帮助,但这是我的课程架构

const CourseSchema = new mongoose.Schema({
    name:{type:String,required:true},
    status:{type:String,required:true},
    subject:{
        type:mongoose.Schema.Types.ObjectId,
        ref :'subjects'
    },
    teacher:{
        type:mongoose.Schema.Types.ObjectId,
        ref :'users'
    },
    sessions:[
        {
         Date:{type:Date,required:true},
         timeStart:{type:String,required:true},
         timeEnd  :{type:String,required:true},
         students :[{
             type:mongoose.Schema.Types.ObjectId,
             ref :'users'
         }]   
        }
    ]
})

提前谢谢你。

【问题讨论】:

    标签: node.js mongodb express mongoose aggregation-framework


    【解决方案1】:

    我相信您正在尝试实现这样的目标:

    app.get('/sessions', (req, res) => {
      const teacher = req.query.teacherId
      const subject = req.query.subjectId
      const status = req.query.statusId
    
      const query = [];
      if (teacher) query.push({ $match: { teacher: teacher } });
      if (subject) query.push({ $match: { subject: subject } });
      if (status) query.push({ $match: { status: status } });
      Course.aggregate(query).then(sessions => res.json(sessions))
        .catch(err => res.json(err));
    })
    

    记住,我没有检查查询是否正常。

    【讨论】:

    • 非常感谢......是的工作......进行查询,然后将其传递给 find(query) 但我知道为什么我不能对聚合做同样的事情......即使我尝试应用聚合我的课程模型 empy(Course.aggregate([ ]).then...) 上的方法它不会返回任何内容。没有错误只是什么都没有回来......因为(Course.find({}).then..)我得到的一切都没有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多