Home > OS >  MongoDB aggregation failing because "pipeline stage specification object must contain exactly o
MongoDB aggregation failing because "pipeline stage specification object must contain exactly o

Time:07-19

I have the following aggregation stage that I'd like to add to my pipeline, but it keeps failing. When I use the MongoDB Compass Aggregation GUI, everything works as it should. I even exported that pipeline from the GUI and am using It the same way In my project but I keep getting this error: MongoServerError: A pipeline stage specification object must contain exactly one field.

I even tried to hard-coded a productId in the $match value (the same way I did in the GUI), but still nothing.

What am I doing wrong here?

Aggregation stage:

const formatIncludedInBomStage = ({ includedInBom }) => {
  const includedInBomStage = {
    $unwind: {
      path: '$finale.bomItems',
    },
    $match: {
      'finale.bomItems.productId': includedInBom,
    },
  }
  return includedInBomStage
}

CodePudding user response:

Pipeline stages are an array, you are using multiple object properties instead. unwind should be one stage object in the array, and match another object in the array.

const stages = [
      {
        $unwind: {
          path: '$finale.bomItems',
        },
      {
        $match: {
          'finale.bomItems.productId': includedInBom,
        }
      }
]

CodePudding user response:

Solution:

const formatIncludedInBomStage = ({ includedInBom }) => {
  const filters = {}
  if (includedInBom) {
    const unwindStage = {
      $unwind: {
        path: '$finale.bomItems',
      },
    }
    const matchStage = {
      $match: {
        'finale.bomItems.productId': includedInBom,
        ...filters,
      },
    }
    const bomStages = [unwindStage, matchStage]
    return bomStages
  } else return []
}

const includedInBomStage = formatIncludedInBomStage({
    includedInBom,
})

const cursor = products.aggregate([stage1,stage2,...includedInBomStage])
  • Related