首页 > 解决方案 > 如何使用聚合检查 MongoDB 数据库中的所有文档以获取特定字段的最新值?

问题描述

我是 MongoDB 的新手,正在使用它处理 NodeJS 代码。

我需要使用聚合函数来提取book_version每本书的最新版本。

这是我的数据库的外观:

[
  {
    "book_id": "ab12nld”,
    "book_version": "0”,
    "author": “Sam”,
    “name”: “Sample Book”,
    “comments”: “Done”
  },
  {
    "book_id": "ab12nld”,
    "book_version": "1",
    "author": "Martin",
    "name": "Sample Book",
    “comments”: “In Progress”
  },
  {
    "book_id": "ab12nld”,
    "book_version": "2",
    "author": "Roy",
    "name": "Sample Book",
    “comments”: “To-Do”
  }
]
[
  {
    "book_id": "bcj123n”,
    "book_version": "0”,
    "author": “Don”,
    “name”: “Another Book”,
    “comments”: “Done”
  },
  {
    "book_id": "bcj123n”,
    "book_version": "1",
    "author": "Ray",
    "name": "Another Book",
    “comments”: “In Progress”
  },
  {
    "book_id": "bcj123n”,
    "book_version": "2",
    "author": "Max",
    "name": "Another Book",
    “comments”: “To-Do”
  }
]
[
  {
    "book_id": "k23d1d3”,
    "book_version": "0”,
    "author": “Sunny”,
    “name”: “New Book”,
    “comments”: “Done”
  },
  {
    "book_id": "k23d1d3”,
    "book_version": "1",
    "author": "Archer",
    "name": "New Book",
    “comments”: “In Progress”
  }
]
[
  {
    "book_id": "o902f3s”,
    "book_version": "0”,
    "author": “Joy”,
    “name”: “Nice Book”,
    “comments”: “Done”
  },
  {
    "book_id": "o902f3s”,
    "book_version": "1",
    "author": "James",
    "name": "Nice Book",
    “comments”: “In Progress”
  },
{
    "book_id": "o902f3s”,
    "book_version": "2”,
    "author": “Pam”,
    “name”: “Nice Book”,
    “comments”: “Done”
  },
  {
    "book_id": "o902f3s”,
    "book_version": "3",
    "author": "Jonah",
    "name": "Nice Book",
    “comments”: “Completed”
  }
]

book_version结果,我应该得到每个对象的最大值book_id以及整个对象:

{
    "book_id": "ab12nld”,
    "book_version": "2",
    "author": "Roy",
    "name": "Sample Book",
    “comments”: “To-Do”
  },
{
    "book_id": "bcj123n”,
    "book_version": "2",
    "author": "Max",
    "name": "Another Book",
    “comments”: “To-Do”
  },
{
    "book_id": "k23d1d3”,
    "book_version": "1",
    "author": "Archer",
    "name": "New Book",
    “comments”: “In Progress”
  },
  {
    "book_id": "o902f3s”,
    "book_version": "3",
    "author": "Jonah",
    "name": "Nice Book",
    “comments”: “Completed”
  }

标签: mongodbmongooseaggregation-frameworkaggregation

解决方案


您可以使用$sort和的组合$group来实现所需的结果:

db.collection.aggregate([
  {
    $sort: {
      // Sort by the book_version from highest to lowest 
      book_version: -1
    }
  },
  {
    $group: {
      // Group the documents by their book_id
      _id: "$book_id",
       book_version: {
        // The first book_version is the highest book version
        // The same thing applies to every other first-of other book fields 
        $first: "$book_version"
      },
      book_id: {
        $first: "$book_id"
      },
      author: {
        "$first": "$author"
      },
      name: {
        "$first": "$name"
      },
      comments: {
        "$first": "$comments"
      }
    }
  }
])

推荐阅读