【问题标题】:How to group/aggregate using mongoose?如何使用猫鼬进行分组/聚合?
【发布时间】:2019-02-01 14:01:01
【问题描述】:

我有一个充满类似于书籍的数据对象的数据库。这也适用于书籍版本,因此如果书籍 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 文档,但丢弃所有旧版本?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

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

    【讨论】:

    • 这几乎可以解决问题。我得到的是一组具有我不需要的_id 字段的对象,以及冗余books 对象背后的所有有用信息。有没有办法在没有_id 和books 对象的情况下简单地返回$group 调用的结果,即与我刚刚完成$match 的结构相同?
    • 原来我得到了上述问题的答案是replaceRoot:stackoverflow.com/questions/54489090/…
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2017-02-27
      • 2020-07-26
      • 2015-08-21
      • 2015-03-04
      • 2018-01-30
      • 2018-08-22
      • 2015-02-27
      • 2012-09-14
      • 1970-01-01
      相关资源
      最近更新 更多