收藏
回答

$or 的使用

框架类型 问题类型 操作系统 工具版本
小程序 Bug macOS 当前已是最新版本(1.06.2407120 darwin-x64)

根据条件过滤文,在开发者工具中使用 $or 无法查到数据,但是在开发者的云开发数据库中使用相同的操作代码可以查到数据

const query = {
  creator: OPENID,
  taskType: _.eq('1'), // 任务类型
  taskRepeat: _.eq('1'), // 筛选不重复任务
  delFlag: _.eq('0'),
  status: _.in(['0', '1']), //0 未开始 1 进行中 2 已完成 3 已取消
  $or: [
   // 条件1: 如果查询未开始一定要 startTime 和 endTime 在今天范围内
   {
    status: _.eq('0'),
    startTime: _.gte(todayStartDateNow).and(_.lte(todayEndDateNow)),
   },
  ],
 };


 // 筛选优先级
 if (taskPriority) {
  query.taskPriority = _.eq(taskPriority);
 }
 // 如果是查询重复任务,则不查询时间
 if (taskRepeat) {
  query.taskRepeat = _.neq('1');
  delete query.$or; // 移除时间条件,避免冲突
 }
 //  查询定时任务
 if (taskTiming) {
  delete query.$or;
  query.status = _.eq('0');
  query.startTime = _.gte(todayEndDateNow);
 }
 //
 try {
  // 使用 aggregate 聚合查询2311
  const res = await db
   .collection('task-list')
   .aggregate()
   .match(query)
   .addFields({
    isFinish: {
     $cond: {
      if: { $eq: ['$finishTime', ''] }, // 判断 finishTime 是否为空
      then: 0, // 没有 finishTime
      else: 1, // 有 finishTime
     },
    },
   })
   .sort({
    isFinish: 1, // isFinish 为 0 的在前面
    startTime: 1, // isFinish 为 0 的项按 startTime 排序
    finishTime: 1, // isFinish 为 1 的项按 finishTime 排序
   })
   .project({
    isFinish: 0, // 排除辅助字段
   })
   .lookup({
    from: 'task-sub-list',
    let: { task_list_id: '$_id' },
    pipeline: $.pipeline()
     .match(_.expr($.and([$.eq(['$taskId', '$$task_list_id']), $.eq(['$delFlag', '0'])])))
     .addFields({
      isFinish: {
       $cond: {
        if: { $eq: ['$finishTime', ''] },
        then: 0,
        else: 1,
       },
      },
     })
     .sort({
      isFinish: 1, // isFinish 为 0 的在前面
      createTime: 1, // 没有 finishTime 的项按 createTime 排序
      finishTime: 1, // 有 finishTime 的项按 finishTime 排序
     })
     .project({
      isFinish: 0, // 排除辅助字段
     })
     .done(),
    as: 'taskSubList',
   })
   .end();


回答关注问题邀请回答
收藏

2 个回答

  • 老张
    老张
    08-30

    两者的区别在于权限不同,看看是否这个原因。

    08-30
    有用
    回复
  • ChillChampion
    ChillChampion
    08-30

    08-30
    有用
    回复
登录 后发表内容