首页 > 解决方案 > 使用 mongodb 文档的其他字段显示数组的条件大小

问题描述

我有一个集合,fridges我希望每个冰箱的一些字段匹配一个条件加上这个冰箱中物品的“条件大小”。

这是我的数据库的一个例子:

db={
  "fridges": [
    {
      _id: 1,
      items: [
        {
          itemId: 1,
          name:"beer"
        },
        {
          itemId: 2,
          name: "chicken"
        }
      ],
      brand:"Bosch",
      size:195,
      cooler:true,
      color:"grey"
    },
    
    {
      _id: 2,
      items: [
        {
          itemId: 1,
          name:"beer"
        },
        {
          itemId: 2,
          name: "chicken"
        },
        {
          itemId: 3,
          name: "lettuce"
        }
      ],
      brand:"Electrolux",
      size:200,
      cooler:true,
      color:"white"
    },
  ]
}

我想得到fridges这些相互条件('和'条件):

另外:有名字的项目数$in ["beer","lettuce"]

最后:删除一些字段,如结果的sizeitems

在我们的示例中,例外输出将是:

{
  _id:1
  itemsNumber:1,
  brand:"Bosch",
  cooler:true,
  color:"grey"
}

说明:我们删除了字段itemsand size,从数组itemsNumber中计算啤酒和生菜的数量。items我们只保留第一台冰箱,它的品牌是博世,它是灰色的。

这是我到目前为止所拥有的:

db.fridges.aggregate([
  {
    "$match": {
      $and: [
        {
          "brand": {
            $in: [
              "Bosch",
              "Samsung"
            ]
          }
        },
        {
          "color": {
            $in: [
              "grey",
              "white"
            ]
          }
        }
      ]
    }
  },
  {
    "$project": {
      "itemsNumber": {
        $size: "$items" // This is not good
      },
      brand: 1,
      cooler: 1,
      color: 1
    }
  }
])

哪个返回我:

[
  {
    "_id": 1,
    "brand": "Bosch",
    "color": "grey",
    "cooler": true,
    "itemsNumber": 2
  }
]

beer计算与or匹配的项目lettuce是我的主要问题。 是一个可执行的例子。

提前致谢 !

标签: mongodbaggregation-framework

解决方案


我发现了如何使它工作。感谢@joe 建议使用过滤器,这确实是解决方案。

这是完整的查询:

db.fridges.aggregate([
  {
    $match: {
      $and: [
        {
          "brand": {
            $in: [
              "Bosch",
              "Samsung"
            ]
          }
        },
        {
          "color": {
            $in: [
              "grey",
              "white"
            ]
          }
        }
      ]
    }
  },
  {
    $project: {
      "itemsNumber": {
        "$filter": {
          "input": "$items",
          "as": "item",
          "cond": {
            $in: [
              "$$item.name",
              [
                "beer",
                "lettuce"
              ]
            ]
          }
        }
      },
      brand: 1,
      cooler: 1,
      color: 1
    }
  }
])

可运行的示例。


推荐阅读