根据条件过滤文,在开发者工具中使用 $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();
两者的区别在于权限不同,看看是否这个原因。