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

铁华夫饼人

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

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

第一次匹配只是进行正常的匹配操作,例如按作者或流派或其他方式进行搜索。我的印象是$group然后将所有结果压缩为 unique book_id,但事实并非如此,因为我得到的只是一个看起来像{ _id: earg684rthae68g486e }. 如何让它返回完整的 Book 文档,但丢弃所有旧版本?

猫王

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

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

上面将为书籍字段中的每个 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"
            }
        }
    }
])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章