如何聚合MongoDB查询以删除for循环的使用



我是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”
}

如果使用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 })
db.books.aggregate([{ "$sort": { "book_version": -1 } },{"$limit":1}])

我知道您想要检索一个字段值最高的文档。

这里,在version字段中具有最高值的文档。最简单的方法是按相反的顺序sort并获得第一个文档。

您也可以使用聚合方法。

请尝试以下片段。我认为这会有所帮助。

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

最新更新