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,有很多,请查看它。我正在寻找是否有任何解决办法,否则我会更新我的答案,以正确的方向。