繁体   English   中英

如何使用猫鼬分组/聚合?

[英]How to group/aggregate using mongoose?

我有一个充满类似于书籍的数据对象的数据库。 这也适用于书籍版本,因此,如果书籍A已被印刷9次,则我的数据库中有9个示例。 将这9个示例联系起来的是它们有一个id,例如book_id 在我的搜索结果中,我希望舍弃所有具有相同book_id结果,但其中一个是具有最新的published_date 问题是,我不确定如何使聚合正常工作。 这是我现在所拥有的:

return Book.aggregate([
    { $match: generateMLabQuery(rawQuery) },
    { $group: { _id: '$book_id' } },

第一个匹配项只是做正常的匹配项,例如按作者或流派或其他内容进行搜索。 我的印象是$group然后将通过唯一的book_id压缩所有结果,但事实并非如此,因为返回的只是一个看起来像{ _id: earg684rthae68g486e }的项目数组。 如何获得完整的Book文档,但所有旧版本都被丢弃的信息?

由于这些书籍之间的链接是'book_id',因此很明显,您需要按'book_id'字段进行分组,这意味着对于每个'book_id',您都会获得一系列书籍。

return Book.aggregate([
    { $match: generateMLabQuery(rawQuery) },
    {
        $group: {
            _id: "$book_id",
            books: {
                $push: "$$ROOT"
            }
        }
    }
])

以上将为您提供有关books字段中每个book_id的文档数组。

但是,每个book_id只需要一本书,并且该书必须是带有最新“ published_date”的书,因此,如果您根据“ published_date”以降序对结果进行排序,则只需获取数组的第一个对象每次。

return Book.aggregate([
    { $match: generateMLabQuery(rawQuery) },
    {
        $sort: {
            "published_date": -1
        }
    },
    {
        $group: {
            _id: "$book_id",
            books: {
                $first: "$$ROOT"
            }
        }
    }
])

组创建新对象; 您可以操纵$first / $last累加器运算符来消化所需的字段,然后对它们进行$project

return Book.aggregate([
  { $match: generateMLabQuery(rawQuery) },
  { 
    $group: {
      _id: '$book_id',
      published_date: { $last: '$published_date' },
      title: { $first: '$title' },
      author: { $first: '$author' }
    }
  },
  {
    $project: {
      _id: '$id',
      book_id: '$_id',
      published_date: 1,
      title: 1,
      author: 1
    }
  }
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM