每个数组应包含使用 MongoDB 中的 Facet 的唯一元素

问题描述 投票:0回答:1

这里我添加了 Mongo Playground URL 我的模式结构是什么样的

现在我想要 3 个独特的数组元素,分别是 mostPurchased、latestRewards 和 suggestRewards

所以我试图通过使用 $facet 来实现

{
    $facet: {
      mostPurchased: [
        {
          $sort: {
            buyerCount: -1
          }
        },
        {
          $limit: 15
        },
        {
          $group: {
            _id: "$_id",
            doc: {
              $first: "$$ROOT"
            }
          }
        },
        {
          $replaceRoot: {
            newRoot: "$doc"
          }
        }
      ],
      latestRewards: [
        {
          $sort: {
            created: -1
          }
        },
        {
          $group: {
            _id: "$_id",
            doc: {
              $first: "$$ROOT"
            }
          }
        },
        {
          $replaceRoot: {
            newRoot: "$doc"
          }
        },
        {
          $limit: 15
        }
      ],
      suggestedRewards: [
        {
          $match: {
            points: {
              $lt: 300
            }
          }
        },
        {
          $group: {
            _id: "$_id",
            doc: {
              $first: "$$ROOT"
            }
          }
        },
        {
          $replaceRoot: {
            newRoot: "$doc"
          }
        },
        {
          $limit: 15
        }
      ]
    }
  },
  {
    $project: {
      mostPurchased: 1,
      latestRewards: 1,
      suggestedRewards: 1
    }
  }

但是这个会在每个数组上产生重复的元素。

注意:所有阶段聚合都应在投影之前执行,以便每个数组包含 15 个元素。作为参考,我在 mongo Playground 上添加了 8 个元素。

让我知道哪里出错了

mongodb mongodb-query
1个回答
0
投票

使用

$group
根据唯一标识符聚合唯一文档。 应用
$facet
阶段为每个数组执行所需的操作。

[
  {
    $group: {
      _id: "$_id",
      doc: { $first: "$$ROOT" }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$doc"
    }
  },
  {
    $facet: {
      mostPurchased: [
        {
          $sort: {
            buyerCount: -1
          }
        },
        {
          $limit: 15
        }
      ],
      latestRewards: [
        {
          $sort: {
            created: -1
          }
        },
        {
          $limit: 15
        }
      ],
      suggestedRewards: [
        {
          $match: {
            points: {
              $lt: 300
            }
          }
        },
        {
          $limit: 15
        }
      ]
    }
  },
  {
    $project: {
      mostPurchased: 1,
      latestRewards: 1,
      suggestedRewards: 1
    }
  }
]
© www.soinside.com 2019 - 2024. All rights reserved.