【问题标题】:How to aggregate a MongoDB query to remove the usage of a for loop?如何聚合 MongoDB 查询以删除 for 循环的使用?
【发布时间】:2019-10-25 08:59:49
【问题描述】:

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

正如您在下面的代码中看到的那样,我正在对我的图书收藏运行一个 for 循环,以找出 query_book 的最新版本。

我知道这效率不高,想了解如何在 MongoDB 中为其编写聚合函数。

当前代码:

let result= {};
_.forEach(books, function(query_book)
{
   if(!result[query_book.book_id])
   {
     result[query_book.book_id] = query_book
   }
   else if(result[query_book.book_id].book_version < 
            query_book.book_version)
   {
     result[query_book.book_id] = query_book
   }

books 的数据对象:

[
  {
    "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 获取最大值为book_version 的对象,即ab12nld:

{
    "book_id": "ab12nld”,
    "book_version": "2",
    "author": "Roy",
    "name": "Sample Book",
    “comments”: “To-Do”
  }

【问题讨论】:

  • 你的 for 循环有问题,你似乎没有使用i。也许发布您想要的输入和输出或更新该循环以工作。
  • @thomasin:我已经编辑了循环并添加了所需的输出。

标签: database mongodb aggregate


【解决方案1】:

如果使用 Node.js Mongo 驱动程序(将 [bookId] 替换为您的输入)

db.collection('books')
  .findOne({ book_id: [bookId] }, { sort: [['book_version', -1]] }) 

或者,如果使用 Mongoose,

Book.findOne({ book_id: [bookId] }).sort({ book_version: -1 })

【讨论】:

    【解决方案2】:
     db.books.aggregate([{ "$sort": { "book_version": -1 } },{"$limit":1}])
    

    【讨论】:

    • 我想获取我要输入的 book_id 的最高 book_version。我怎样才能在这个查询中做同样的事情?
    • db.books.aggregate([{"$match":{"book_id": "ab12nld"}},{ "$sort": { "book_version": -1 } },{" $limit":1}])
    • db.books.aggregate([{"$group":{"_id":"$book_version","obj":{ "$push": "$$ROOT" }}}, {$sort:{_id:-1}},{$limit:1}]) 。结果看起来像 - { "_id" : "7", "obj" : [ { "_id" : ObjectId("5*.."), "book_id" : "ab12nld-best", "book_version" : "7 ", "author" : "Roy", "name" : "Sample Book the best one", "cmets" : "To-Do" } ] }
    【解决方案3】:

    我了解到您想要检索具有最高字段值的文档。

    这里是version 字段中具有最高值的文档。执行此操作的最简单方法是以相反的顺序 sort 并获取第一个文档。

    您也可以使用聚合方法。

    试试下面的 sn-p。我认为这会有所帮助。

    db.books.find().sort({"book_version":-1}).limit(1);
    

    【讨论】:

    • 我想获取我要输入的 book_id 的最高 book_version。我怎样才能在这个查询中做同样的事情?
    • 试试:db.books.find({"book_id":"abcd"}).sort({"book_version":-1}).limit(1);
    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 2018-02-08
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多