MongoDB聚合-匹配输入参数(如果提供),否则不匹配
我有一个MongoDB聚合查询,其中包含以下内容:MongoDB聚合-匹配输入参数(如果提供),否则不匹配,mongodb,aggregation,Mongodb,Aggregation,我有一个MongoDB聚合查询,其中包含以下内容: { $match: { version: versionNumber } “versionNumber”是聚合的可选输入参数。如果未提供此版本号,则我不希望执行此匹配 目前,如果没有提供versionNumber,匹配仍然会发生,我会得到一个空白的查询输出 Mongo有没有办法做到这一点?谢谢 有一种方法可以做到这一点,是的,但应该在应用程序代码中完成。在构建要传递到查询的管道阵列时,如果提供了必要的信息,则仅包括$match阶段 var p
{ $match: { version: versionNumber }
“versionNumber”是聚合的可选输入参数。如果未提供此版本号,则我不希望执行此匹配
目前,如果没有提供versionNumber,匹配仍然会发生,我会得到一个空白的查询输出
Mongo有没有办法做到这一点?谢谢 有一种方法可以做到这一点,是的,但应该在应用程序代码中完成。在构建要传递到查询的管道阵列时,如果提供了必要的信息,则仅包括
$match
阶段
var pipeline=[]
if (versionNumber) pipeline.push( {$match: {version: versionNumber }} )
pipeline.push( ... Other Stages ... )
db.collection.aggregate(pipeline)
我不确定
versionNumber
中的值在未提供时是什么(可选),让我们假设versionNumber
将是中的任何值
- 如果
versionNumebr
不可用,则它将跳过,当可用时,它将匹配$eq
条件
- 您可以在数组
[null,”,“undefined”]
,0
zero或任何您想跳过的内容中添加更多值
- 如果
versionNumebr
始终是单个可能值”
,则可以使用$eq
而不是$in
听起来您想跳过聚合中的管道。是吗?是的,我想说有条件的跳过。谢谢你的回答,但是$expr不能与聚合一起使用。不接受。相反,使用查询表达式在$match中包含聚合表达式。
{
$match: {
$expr: {
$cond: [
{ $in: [versionNumber, [null, "", "undefined"]] },
true,
{ $eq: ["$version", versionNumber] }
]
}
}
}
{
$match: {
$expr: {
$cond: [
{ $eq: [versionNumber, ""] },
true,
{ $eq: ["$version", versionNumber] }
]
}
}
}