过滤嵌套对象的MongoDB数组

bxfogqkk  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(150)

我使用MongoDB Compass进行查询,同时搜索我继承的大量数据,并且经常被要求为各个团队生成数据报告,但文档中的数据太多,他们无法轻松解析,因此我希望尽可能减少报告的数据
我有以下示例文档

{
  "_id": "123456",
  "name": "Bob",
  "date": "2022-07-01",
  "fruit": [
    {
      "_id": "000001",
      "foodName": "apple",
      "colour": "red"
    },
    {
      "_id": "000002",
      "foodName": "apple",
      "colour": "green"
    },
    {
      "_id": "000003",
      "foodName": "banana",
      "colour": "yellow"
    },
    {
      "_id": "000004",
      "foodName": "orange",
      "colour": "orange"
    }
  ]
}

使用
db.people.find( { "fruit.foodName" : "apple" } )
返回整个文档
我想只搜索苹果,这样我得到的结果是:

{
  "_id": "123456",
  "name": "Bob",
  "date": "2022-07-01",
  "fruit": [
    {
      "_id": "000001",
      "foodName": "apple",
      "colour": "red"
    },
    {
      "_id": "000002",
      "foodName": "apple",
      "colour": "green"
    }
  ]
}

这可能吗?

efzxgjgh

efzxgjgh1#

您将需要为此使用聚合并使用$filter操作符。您不能为此使用查询语言的原因是它们的投影选项有限,并且只允许投影单个数组元素,因为在您的情况下,数组可以包含多个匹配的子文档,它不会这样做。
您可以阅读有关查询语言投影的更多信息here

db.collection.aggregate([
  {
    $match: {
      "fruit.foodName": "apple"
    }
  },
  {
    $addFields: {
      fruit: {
        $filter: {
          input: "$fruit",
          cond: {
            $eq: [
              "$$this.foodName",
              "apple"
            ]
          }
        }
      }
    }
  }
])

Mongo Playground

相关问题