Node.js 如何仅在特定条件下执行一个MongoDB聚合阶段? 如果某个条件的计算结果为true或false,是否有任何方法可以对其中一个MongoDB聚合阶段进行操作?

Node.js 如何仅在特定条件下执行一个MongoDB聚合阶段? 如果某个条件的计算结果为true或false,是否有任何方法可以对其中一个MongoDB聚合阶段进行操作?,node.js,mongodb,Node.js,Mongodb,我正在构建餐厅搜索应用程序,在那里你可以通过名称、他们提供的菜肴等来查找餐厅。用户可以输入的字段之一是餐厅名称字段。如果用户将其留空,我不想在名称字段上执行$text搜索,但我不知道如何实现它 这是我的示例代码,但它不起作用,因为它会碰撞警报MongoError:unknown top level operator:$cond const { borough, cuisine, name } = req.body; try { const restaurantCollection

我正在构建餐厅搜索应用程序,在那里你可以通过名称、他们提供的菜肴等来查找餐厅。用户可以输入的字段之一是餐厅
名称
字段。如果用户将其留空,我不想在名称字段上执行
$text
搜索,但我不知道如何实现它

这是我的示例代码,但它不起作用,因为它会碰撞警报
MongoError:unknown top level operator:$cond

const { borough, cuisine, name } = req.body;

  try {
    const restaurantCollection = databaseFunctions
      .getDatabase()
      .collection('restaurants');
    const fetchedRestaurants = await restaurantCollection
      .aggregate([
        {
          $match: {
            $and: [
              {
                $cond: {
                  if: { $ne: [name, ''] },
                  then: { $text: { $search: name } },
                  else: null,
                },
              },
              { borough: { $in: borough } },
              { cuisine: { $in: cuisine } },
            ],
          },
        }]
  } catch {...}

如何实现它?

首先查看您的错误
MongoError:unknown top level operator:$cond
,是一个聚合表达式,您需要在
$和
操作之前使用


其次,您不能在任何表达式中使用
$text
搜索查看更多信息,我的建议您最好在客户端检查空
名称
条件。

因此,我终于自己解决了代码的问题。 我将聚合管道移动到另一个常量(名为
aggregationPipeline
)。然后,如果
name
变量不是空的,我将使用array unshift方法将
$text
agregion阶段添加到我的管道中。我知道这很简单,但我花了一些时间才弄明白。这是我的密码。如果你有更好的解决方案,请发布

const aggregationPipeline = [
    // all my others aggregation pipeline stages
  ];

  if (name)
    aggregationPipeline.unshift({ $match: { $text: { $search: name } } });

因此,如果我只想在某些情况下使用此模式执行某种类型的聚合操作:$expr:{$cond:{…},这是个好主意吗?我尝试使用与您在回答中指定的代码相同的代码,但它显示了错误消息:MongoError:Unrecognized expression'$text',好的,是的,很抱歉我忘记查看$text,可能是您不能在任何表达式中使用$text,有很多,请查看它。我正在寻找是否有任何解决办法,否则我会更新我的答案,以正确的方向。