这里我添加了 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 个元素。
让我知道哪里出错了
使用
$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
}
}
]