此函数按预期工作。
static getUsersWithTasks = (ids) => {
const db = getDb();
return db
.collection(process.env.USERSCOLLECTION)
.aggregate([
{ $match: { _id: { $in: ids } } },
{
$project: {
password: 0,
tokens: 0,
spaces: 0,
incomingSpaceInvites: 0,
incomingFriendRequest: 0,
friends: 0
}
},
{
$lookup: {
from: "challenges",
let: { tasks: "$tasks" },
pipeline: [
{
$match: {
$expr: { $in: ["$_id", "$$tasks"] }
}
}
],
as: "populatedTasks"
}
}
])
.toArray();
};
但是,某些用户只有一个空的tasks
数组,因为他们尚未创建任务。
因此,如果用户有一个空的tasks
数组,那么我会收到一个mongodb错误,因为$in需要一个数组作为第二个参数。
如果所有用户在tasks
数组中都有一个值,那么一切正常。
我的问题是:
如果数组tasks
用户为空,有没有办法跳过查找阶段?
谢谢你的时间!
您有两个选择:
使用 $facet 将您的聚合拆分为 2(一个用于有任务的用户,一个用于没有任务的用户(,但这会产生一个"混乱"的管道,我不确定它会比使用选项 2 更有效(如果您尝试让我知道(。
为没有空数组的用户创建
tasks
为空数组,这不会"跳过"具有空tasks
数组的用户,因此性能会受到影响,但聚合不会失败,为此,请在$lookup
阶段之前添加以下$project
阶段:
{
$project:{
tasks: {$ifNull: ["$tasks", []]}
}
}