首页 > 解决方案 > Mongodb聚合从数组中获取所需的对象

问题描述

我的示例文档是:

{
  "_id": 1,
  "offers": [
    {
      "id": 12345,
      "amount": 100,
      "eligibleProducts": [
        111,
        123,
        156
      ]
    },
    {
      "id": 12346,
      "amount": 100,
      "eligibleProducts": [
        222,
        333
      ]
    }
  ]
}

我想过滤offerswith eligibleProducts

如果我eligibleProducts是 [111, 777, 888] 则返回:

{
          "id": 12345,
          "amount": 100,
          "eligibleProducts": [
            111,
            123,
            156
          ]
        }

我使用$setIsSubset了聚合,但这是与完整数组进行比较,

"Offers" : { "$filter" : { "input" : "$Offers", "as" : "offer", "cond" : { "$and" : [{ "$setIsSubset" : {[111, 777, 888], "$$offer.eligibleProducts"]}}]}}}

标签: mongodbaggregation-framework

解决方案


我使用了 $setIsSubset 聚合,但这是与完整数组进行比较,

$setIsSubset在这里不起作用,因为当第一个数组是第二个数组的子集时返回 true,包括当第一个数组等于第二个数组时,否则返回 false。

您可以尝试以下方法,

  • $matcheligibleProducts输入中的 id 以过滤主要文档
  • $filteroffers迭代数组的循环
  • $filter迭代数组循环eligibleProducts并检查输入ID中的ID
  • $ne检查上述过滤结果是否 [] 为空然后返回对象
db.collection.aggregate([
  {
    $match: {
      "offers.eligibleProducts": {
        $in: [111, 777, 888]
      }
    }
  },
  {
    $project: {
      offers: {
        $filter: {
          input: "$offers",
          cond: {
            $ne: [
              {
                $filter: {
                  input: "$$this.eligibleProducts",
                  cond: { $in: ["$$this", [111, 777, 888]] }
                }
              },
              []
            ]
          }
        }
      }
    }
  }
])

操场


推荐阅读