MongoDB聚合-匹配输入参数(如果提供),否则不匹配

MongoDB聚合-匹配输入参数(如果提供),否则不匹配,mongodb,aggregation,Mongodb,Aggregation,我有一个MongoDB聚合查询,其中包含以下内容: { $match: { version: versionNumber } “versionNumber”是聚合的可选输入参数。如果未提供此版本号,则我不希望执行此匹配 目前,如果没有提供versionNumber,匹配仍然会发生,我会得到一个空白的查询输出 Mongo有没有办法做到这一点?谢谢 有一种方法可以做到这一点,是的,但应该在应用程序代码中完成。在构建要传递到查询的管道阵列时,如果提供了必要的信息,则仅包括$match阶段 var p

我有一个MongoDB聚合查询,其中包含以下内容:

{ $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] }
        ]
      }
    }
  }