Javascript 如何使用mongoose进行分组/聚合?

Javascript 如何使用mongoose进行分组/聚合?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我有一个数据库,里面充满了类似于书籍的数据对象。这也适用于书籍版本,所以如果书籍A已经印刷了9次,那么我的数据库中就有9个例子。这9个示例的链接是它们有一个id,比如说book\u id。在我的搜索结果中,我想放弃所有具有相同图书id的结果,除了一个,即具有最新出版日期的结果。问题是,我不知道如何让聚合正常工作。以下是我现在拥有的: return Book.aggregate([ { $match: generateMLabQuery(rawQuery) }, { $group:

我有一个数据库,里面充满了类似于书籍的数据对象。这也适用于书籍版本,所以如果书籍A已经印刷了9次,那么我的数据库中就有9个例子。这9个示例的链接是它们有一个id,比如说
book\u id
。在我的搜索结果中,我想放弃所有具有相同
图书id
的结果,除了一个,即具有最新
出版日期的结果。问题是,我不知道如何让聚合正常工作。以下是我现在拥有的:

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

第一个匹配只是做一些普通的匹配工作,比如按作者、流派或其他什么进行搜索。我的印象是,
$group
然后会通过unique
book\u id
压缩所有结果,但事实并非如此,因为我返回的只是一个看起来像
{u id:earg684rthae68g486e}
的项目数组。如何让它返回完整的图书文档,但放弃所有旧版本?

Group创建新对象;您可以操作
$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
    }
  }
])

由于这些书籍之间的链接是“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"
            }
        }
    }
])

这几乎成功了。我得到的是一个对象数组,它有一个我不需要的
\u id
字段,以及冗余
书籍
对象背后的所有有用信息。有没有一种方法可以简单地返回
$group
调用的结果,而不使用
\u id
books
对象,也就是说,它的结构与我刚刚完成
$match
的结构相同?我得到的上述问题的答案是
replaceRoot