mongoDB $in检查数组是否为空?



此函数按预期工作。

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(一个用于有任务的用户,一个
  1. 用于没有任务的用户(,但这会产生一个"混乱"的管道,我不确定它会比使用选项 2 更有效(如果您尝试让我知道(。

  2. 为没有空数组的用户创建tasks为空数组,这不会"跳过"具有空tasks数组的用户,因此性能会受到影响,但聚合不会失败,为此,请在$lookup阶段之前添加以下$project阶段:

{
$project:{
tasks: {$ifNull: ["$tasks", []]}
}
}

相关内容

最新更新