仅在 mongodb 中聚合的对象数组内的每个对象中获取精确匹配

问题描述 投票:0回答:1
  • 我在 mongo db 中的产品集合是这样的:
Product {
  variations [
    {
      color,
      size
    }
  ]
 
}
  • 我只有一种产品:
{
  variations [
    {
      color: "Verde",
      size: "xxs"
    },
    {
      color: "Blu",
      size: "m"
    },
  ]
}

示例:

  • 如果我想要颜色:“Verde”和尺寸:“m”的产品,我应该什么也收到
  • 如果我想要颜色:“Blu”和尺寸:“xxs”的产品,我什么也不会收到
  • 如果我想要颜色:“Verde”和尺寸:“xxs”的产品,我应该收到产品
  • 如果我想要颜色:“Blu”和尺寸:“m”的产品,我应该收到产品
mongodb mongoose search aggregation
1个回答
0
投票

通常有两个选项可以实现 mongoDB 中的需求,最合适的是使用 $elemMatch 操作:

选项 1:查找/项目

db.collection.find({
variations: {
 "$elemMatch": {
  "color": "Verde",
  "lots.size": "xxs"
   }
 }
},
{
 variations: {
  "$elemMatch": {
    "color": "Verde",
    "lots.size": "xxs"
  }
 }
})

解释: 这是最简单的选择。

游乐场

选项2:聚合/$match/$filter

db.collection.aggregate([
{
 $match: {
  variations: {
    "$elemMatch": {
      "color": "Verde",
      "lots.size": "xxs"
    }
   }
  }
 },
 {
 "$project": {
  variations: {
    "$filter": {
      "input": "$variations",
      "as": "v",
      "cond": {
        "$and": [
          {
            "$eq": [
              "$$v.color",
              "Verde"
            ]
          },
          {
            "$in": [
              "xxs",
              "$$v.lots.size"
            ]
          }
        ]
      }
    }
  }
 }
}
])

解释: 在此选项中,您可以设置条件并通过聚合框架过滤匹配元素。

游乐场2

© www.soinside.com 2019 - 2024. All rights reserved.