收藏
回答

联表查询多个查询条件怎么实现?

我有两个集合:

集合1:users有以下数据

[{"userId":"zqiang","age":20},
{"userId":"lling","age":27},
{"userId":"wcjing","age":19},
{"userId":"wxia","age":21},
{"userId":"zying","age":18}]

集合2:course有以下数据

[{"name":"zqiang","subject":"体育","class":2,"position":"headman"},
{"name":"lling","subject":"英语","class":1,"position":"monitor"},
{"name":"wcjing","subject":"数学","class":2,"position":"headman"},
{"name":"lling","subject":"美术","class":3,"position":"student"},
{"name":"wcjing","subject":"英语","class":1,"position":"headman"},
{"name":"zqiang","subject":"英语","class":3,"position":"student"},
{"name":"wxia","subject":"英语","class":2,"position":"headman"},
{"name":"zying","subject":"英语","class":2,"position":"student"}]

要求:小程序端有4个筛选条件,分别是users集合的userId,course集合的subject,class,position字段,筛选数值等于数据库的数据。这4个筛选条件可能同时都会选择,也可能只有一项或两项,甚至有可能都没有。如果4个筛选条件都没有就返回所有的数据。

自己想过使用连表查询和动态拼接where条件的方法,试了1天也没有实现,望大神帮忙解决

最后一次编辑于  2020-08-15
回答关注问题邀请回答
收藏

1 个回答

  • o0o有脾气的酸奶
    o0o有脾气的酸奶
    2020-08-15
    const db = cloud.database()
    const _ = db.command
    const $ = _.aggregate
    
    let userMatch = { userId: _.neq('') }, // user默认条件, userId不为空
    courseMatch = [ $.eq(['$name', '$$uid']) ] // user 和 course 的关联字段, uid为lookup的let中定义的变量字段
    // 组装查询条件
    if(event.age){
      userMatch.age = _.eq(event.age)
    }
    if(event.subject){
      courseMatch.push($.eq(['$subject', event.subject]))
    }
    if(event.class){
      courseMatch.push($.eq(['$class', event.class]))
    }
    if(event.position){
      courseMatch.push($.eq(['$position', event.position]))
    }
    
    db.collection('users').aggregate()
      .match(userMatch )
      .lookup({
        from: 'course',
        localField: 'userId',
        foreignField: 'name',
        let: {
          uid: '$userId'
        },
        pipeline: $.pipeline()
          .match(_.expr($.and(courseMatch)))
          .done(),
        as: 'courseList',
      })
      .end()
    

    若认为该回答有用,给回答者点个[ 有用 ],让答案帮助更多的人

    2020-08-15
    有用 1
    回复 2
    • we
      we
      2020-08-15
      谢谢大神。是我表述错误,非常抱歉!4个筛选条件中是course集合的subject,class,position字段,第4个筛选条件是user集合的age,根据小程序端传过来的参数age,筛选大于这个年龄的人在course集合中满足subject,class,position字段的条件的数据,这4个条件同时选择几个作为筛选条件是不确定的
      2020-08-15
      回复
    • o0o有脾气的酸奶
      o0o有脾气的酸奶
      2020-08-17回复we
      这不就是不确定的吗,if存在字段传参就添加对应查询条件
      根据age也没问题呀,看上面
      2020-08-17
      回复
登录 后发表内容
问题标签