首页 > 解决方案 > 如果它来自前端,如何添加 MongoDB 匹配参数,如果不是,则不添加任何参数?

问题描述

我正在使用 NodeJS 在 MongoDB 中创建一个聚合。当使用参数调用解析器函数时,我希望将其添加到 MongoDB 匹配函数中,如果它不存在,则不会添加。我面临的问题是,如果没有添加,则没有结果,如果有添加,则查询无法正常进行。它是这样来的:phaseMatch = 'phase': { $in: CAT,MOD }。我怎样才能让它像phaseMatch = 'phase': { $in: ['CAT','MOD'] }?有没有办法只在 MongoDB 聚合中执行此条件而不使用任何 JS?

async WeeklyTable(_, { batchSize, phase }) {
    let res = [];
    let phaseMatch = "";
    if(phase) phaseMatch = "'phase': { $in: " + phase + " }";
    return await collection.aggregate([{ 
        $match: {
            "segment": { 
                $exists: true, 
                $ne: null 
            },
            phaseMatch
        }    
    }];
}

标签: javascriptmongodb

解决方案


动态构建查询条件的方法有很多,这里有一个简单的例子:

async WeeklyTable(_, { batchSize, phase }) {
    const res = [];
    const matchCond = {
        "segment": {
            $exists: true,
            $ne: null
        },
    }
    if(phase) {
        matchCond.phase = {$in: phase}
    };
    return await collection.aggregate([{
        $match: matchCond
    }];
}

不确定您要如何将其创建为字符串,Mongo 驱动程序不会将字符串参数解析为查询条件。

编辑

没有任何 javascript 你可以这样做:

db.collection.aggregate([
  {
    $match: {
      "segment": {
        $exists: true,
        $ne: null
      },
      $expr: {
        "$setIsSubset": [
          [
            "$phase"
          ],
          {
            $ifNull: [
              phase,
              [
                "$phase"
              ]
            ]
          }
        ]
      }
    }
  }
])

推荐阅读