Javascript 如何使用mongoose进行分组/聚合?
我有一个数据库,里面充满了类似于书籍的数据对象。这也适用于书籍版本,所以如果书籍A已经印刷了9次,那么我的数据库中就有9个例子。这9个示例的链接是它们有一个id,比如说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:
book\u id
。在我的搜索结果中,我想放弃所有具有相同图书id
的结果,除了一个,即具有最新出版日期的结果。问题是,我不知道如何让聚合正常工作。以下是我现在拥有的:
return Book.aggregate([
{ $match: generateMLabQuery(rawQuery) },
{ $group: { _id: '$book_id' } },
第一个匹配只是做一些普通的匹配工作,比如按作者、流派或其他什么进行搜索。我的印象是,$group
然后会通过uniquebook\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
: