【问题标题】:Unable to populate and structure document with aggregate无法使用聚合填充和构造文档
【发布时间】:2021-12-14 00:33:39
【问题描述】:

所以我有这个架构,它具有数据库中其他集合的外键。该文档有大约 60k 个帖子,每个帖子可以有多个类别,大约有 200 个类别。因此,我尝试根据类别的外键获取和构造数据,并填充类别详细信息和计数。

主架构和类别架构如下所示:

const postSchema = new mongoose.Schema( {
    post: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'PostDetails'
    },
    categories: [ {
        category: {
            type: mongoose.Schema.Types.ObjectId,
            ref: 'Category'
        },
        subCategories: [ {
            subCategory: {
                type: mongoose.Schema.Types.ObjectId,
                ref: 'Subcategory'
            }
        } ]
    } ]
} );

const categorySchema = new mongoose.Schema( {
    category: {
        type: String,
    },
    categorySlug: {
        type: String,
    }
} );

我计数成功,但返回的数据不是我预期的。返回的数据显示类别的 id 和计数,但没有名称和 slug。下面是它的样子:

[
   {
       "_id": [
                 "617acfd232c766589c23a90c"
       ],
       "count": 876,
       "category": []
   }
]

我通过以下查询得到了上述输出:

const aggregateStages = [ 
     {
          $group: {
                _id: '$categories.category',
                count: { $sum: 1 }
          }
     },
     {
          $lookup: {
                from: "Category",
                localField: "categories.category",
                foreignField: "_id",
                as: "category"
          }
     }
];

const categories = await Post.aggregate( aggregateStages ).exec();

我希望得到如下数据:

[
   {
       "_id": "617acfd232c766589c23a90c",
       "count": 876,
       "category": 'SomeCategory',
       "categorySlug": 'some-category' 
   }
]

我哪里出错了,我该如何解决?

MATT OESTREICH 要求的数据库中的样本数据

POST DATA

{
    "_id": "617adad39054bae2c983c34f",
    "post": "617ad1c80597c78ed4cc151e",
    "author": "617acc689b309fdbbbdfdfe0",
    "categories": [{
        "category": "617acfd232c766589c23a8d1",
        "subCategories":[]
    }]
}

CATEGORY DATA

{
    "_id": "617acfd232c766589c23a8d1",
    "category": "Lorem Ipsum",
    "categorySlug": "lorem-ipsum"
}

【问题讨论】:

  • 您能提供一些您收藏的样本数据吗?甚至不知道您的数据具有哪些字段等,都很难提供帮助......计数起作用的原因是因为您在查找之前计数并且查找没有找到任何内容,因此问题在您的查找范围内。
  • 嗨,马特。我已经用示例数据更新了帖子。请看一看。
  • 似乎 $lookup 不起作用。我注释掉了小组赛阶段并仅尝试使用 $lookup 但它没有填充。
  • 嘿伙计,有什么解决办法吗? @MattOestreich
  • 现在看看 - 抱歉,我直到现在才有机会。

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

好的,看来您可以使用 $size 运算符解决此问题。 $size 运算符将为您提供数组中元素的长度(或计数)。

Live demo here

数据库

db={
  "post": [
    {
      "_id": ObjectId("617adad39054bae2c983c34f"),
      "post": ObjectId("617ad1c80597c78ed4cc151e"),
      "author": ObjectId("617acc689b309fdbbbdfdfe0"),
      "categories": [
        {
          "category": ObjectId("617acfd232c766589c23a8d1"),
          "subCategories": []
        }
      ]
    }
  ],
  "categories": [
    {
      "_id": ObjectId("617acfd232c766589c23a8d1"),
      "category": "Lorem Ipsum",
      "categorySlug": "lorem-ipsum"
    }
  ]
}

查询

db.post.aggregate([
  {
    "$lookup": {
      "from": "categories",
      "localField": "categories.category",
      "foreignField": "_id",
      "as": "found_categories"
    }
  },
  {
    "$project": {
      _id: "$_id",
      count: {
        "$size": "$found_categories"
      },
      "category": {
        "$first": "$found_categories.category"
      },
      "categorySlug": {
        "$first": "$found_categories.categorySlug"
      }
    }
  }
])

结果

[
  {
    "_id": ObjectId("617adad39054bae2c983c34f"),
    "category": "Lorem Ipsum",
    "categorySlug": "lorem-ipsum",
    "count": 1
  }
]

虽然,我不相信如果找到多个类别,这会给您所需的内容。如果它不起作用,请告诉我,我会尽力帮助解决它。

【讨论】:

  • 您是否修改了查询以匹配您的集合名称?查找有效,正如您在演示中看到的那样。我认为我们忽略了一些小问题。
  • 我缺少一些使查询不正确的东西。你能分享代码吗?老实说,我需要查看它以最好地帮助您。否则,我很难找到错误。
  • 是的,我刚刚意识到,我很抱歉。让我花一些时间在我拥有的测试数据库中设置一个演示环境。我将尝试使用 Mongoose 来解决这个问题,但可能需要大约一个小时左右。
  • 你打赌。如果没有人帮助我,我不会知道我所做的一半,所以我喜欢尽可能“向前支付”。干杯。
  • 这对我来说意义重大,非常感谢。你让我很开心!
猜你喜欢
  • 1970-01-01
  • 2019-06-13
  • 2017-11-06
  • 2017-10-29
  • 2020-07-30
  • 2018-05-20
  • 2021-10-22
  • 2019-11-08
  • 1970-01-01
相关资源
最近更新 更多