首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB聚合失败,因为“管道阶段规范对象必须包含精确的一个字段”

MongoDB聚合失败,因为“管道阶段规范对象必须包含精确的一个字段”
EN

Stack Overflow用户
提问于 2022-07-15 14:05:19
回答 2查看 46关注 0票数 0

我有下面的聚合阶段,我想添加到我的管道中,但是它一直失败。当我使用MongoDB Compass聚合GUI时,一切都按其应有的方式工作。我甚至从GUI导出了这个管道,并在我的项目中以同样的方式使用它,但是我一直收到这样的错误:MongoServerError: A pipeline stage specification object must contain exactly one field.

我甚至试图在productId值中硬编码一个$match (就像在GUI中那样),但仍然没有。

我在这里做错什么了?

集合阶段:

代码语言:javascript
运行
复制
const formatIncludedInBomStage = ({ includedInBom }) => {
  const includedInBomStage = {
    $unwind: {
      path: '$finale.bomItems',
    },
    $match: {
      'finale.bomItems.productId': includedInBom,
    },
  }
  return includedInBomStage
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-18 14:28:12

解决方案:

代码语言:javascript
运行
复制
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])
票数 0
EN

Stack Overflow用户

发布于 2022-07-15 14:24:10

管道阶段是一个数组,而是使用多个对象属性。unwind应该是数组中的一个阶段对象,而match应该是数组中的另一个对象。

代码语言:javascript
运行
复制
const stages = [
      {
        $unwind: {
          path: '$finale.bomItems',
        },
      {
        $match: {
          'finale.bomItems.productId': includedInBom,
        }
      }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72995249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档