Nhận bản ghi mới nhất từ ​​bộ sưu tập mongodb


99

Tôi muốn biết kỷ lục gần đây nhất trong một bộ sưu tập. Làm thế nào để làm điều đó?

Lưu ý: Tôi biết các truy vấn dòng lệnh sau hoạt động:

1. db.test.find().sort({"idate":-1}).limit(1).forEach(printjson);
2. db.test.find().skip(db.test.count()-1).forEach(printjson)

nơi idate có thêm dấu thời gian.

Vấn đề là bộ sưu tập lâu hơn là thời gian để lấy lại dữ liệu và bộ sưu tập 'thử nghiệm' của tôi thực sự rất lớn. Tôi cần một truy vấn với thời gian phản hồi liên tục.

Nếu có bất kỳ truy vấn dòng lệnh mongodb nào tốt hơn, hãy cho tôi biết.

Câu trả lời:


138

Đây là một bản rehash của câu trả lời trước đó nhưng nó có nhiều khả năng hoạt động trên các phiên bản mongodb khác nhau.

db.collection.find().limit(1).sort({$natural:-1})

10
db.collection.find().limit(1).sort({$natural:-1}).pretty()nếu bạn muốn nó trông đẹp
Anthony

Vì vậy, sự khác biệt với thứ tự này là gì:db.collection.find().sort({$natural:-1}).limit(1).pretty()
Leo

@Digits nó sẽ có tác động gì đến hiệu suất nếu chúng tôi đặt giới hạn ở cuối cũng như cách bản ghi cuối cùng được tìm nạp khi bạn đang giới hạn đầu ra cho chỉ một tài liệu và nó phải là tài liệu hàng đầu trong bộ sưu tập.
kailash yogeshwar

Câu trả lời rất hay. Tôi đã cố gắng như thế này: db.collection ( "tên của bộ sưu tập") tìm ({}, {giới hạn: 1}) loại ({$ tự nhiên: -1})..
Abdul Alim Shakir

Đối với bất cứ ai sử dụng AWS DocDB: Query failed with error code 303 and error message 'option $natural is not supported' on server docdb. Hy vọng rằng tính năng đó sẽ sớm ra mắt.
Marc

33

Điều này sẽ cung cấp cho bạn một tài liệu cuối cùng cho một collection

db.collectionName.findOne({}, {sort:{$natural:-1}})

$natural:-1 có nghĩa là thứ tự đối lập với thứ tự mà các bản ghi được chèn vào.

Chỉnh sửa : Đối với tất cả những người phản đối, ở trên là cú pháp Mongoose, cú pháp CLI mongo là:db.collectionName.find({}).sort({$natural:-1}).limit(1)


7
Cú pháp của bạn dường như sai. Tôi không thể làm cho nó hoạt động như bạn có nó. Công việc là gì: 'db.punchdeck.findOne ({$ query: {}, $ orderby: {$ natural: -1}})'
Dave Lowerre

không chắc chắn, tại sao tất cả các downvotes - mã này hoạt động hoàn hảo đối với tôi, và nhanh chóng
dark_ruby

2
@dark_ruby Bạn truy vấn trả về lỗi "$ err": "Không thể làm hợp quy tắc truy vấn: Tùy chọn chiếu BADVALUE được hỗ trợ: sắp xếp: {$ tự nhiên: -1.0}",
La Mã Podlinov

20

Tôi cần một truy vấn với thời gian phản hồi liên tục

Theo mặc định, các chỉ mục trong MongoDB là B-Trees. Tìm kiếm B-Tree là một hoạt động O (logN), vì vậy thậm chí find({_id:...})sẽ không cung cấp các phản hồi O (1) với thời gian không đổi.

Điều đó đã nêu, bạn cũng có thể sắp xếp theo _idnếu bạn đang sử dụng ObjectIdcho mình ID. Xem chi tiết tại đây . Tất nhiên, ngay cả điều đó cũng chỉ tốt đến giây cuối cùng.

Bạn có thể dùng đến "viết hai lần". Viết một lần vào bộ sưu tập chính và viết lại vào bộ sưu tập "cập nhật lần cuối". Nếu không có giao dịch, điều này sẽ không hoàn hảo, nhưng chỉ với một mặt hàng trong bộ sưu tập "cập nhật lần cuối" thì sẽ luôn nhanh chóng.


2
Tôi thấy rất nhiều giải pháp noSQL và MongoDB ủng hộ việc "ghi hai lần", chủ yếu dành cho các bộ đếm khi kích thước dữ liệu trở nên rất lớn. Tôi đoán đây là thông lệ?
Vinny

MongoDB không lưu vào đĩa thường xuyên và nó không có giao dịch, vì vậy việc ghi trở nên nhanh hơn đáng kể. Sự cân bằng ở đây là bạn được khuyến khích khử chuẩn hóa dữ liệu thường dẫn đến ghi nhiều lần. Tất nhiên, nếu bạn nhận được thông lượng ghi 10x hoặc 100x (mà tôi đã thấy), thì 2x hoặc 3x ghi vẫn là một cải tiến lớn.
Gates VP

13

Tuy nhiên, một cách khác để lấy mục cuối cùng từ Bộ sưu tập MongoDB (đừng bận tâm về các ví dụ):

> db.collection.find().sort({'_id':-1}).limit(1)

Phép chiếu bình thường

> db.Sports.find()
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2017", "Body" : "Again, the Pats won the Super Bowl." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

Phép chiếu đã sắp xếp (_id: thứ tự ngược lại)

> db.Sports.find().sort({'_id':-1})
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }
{ "_id" : ObjectId("5bfb6011dea65504b456ab13"), "Type" : "World Cup 2018", "Head" : "Brazil Qualified for Round of 16", "Body" : "The Brazilians are happy today, due to the qualification of the Brazilian Team for the Round of 16 for the World Cup 2018." }
{ "_id" : ObjectId("5bfb5f82dea65504b456ab12"), "Type" : "NFL", "Head" : "Patriots Won SuperBowl 2018", "Body" : "Again, the Pats won the Super Bowl" }

sort({'_id':-1}), xác định một phép chiếu theo thứ tự giảm dần của tất cả các tài liệu, dựa trên _ids.

Phép chiếu đã sắp xếp (_id: thứ tự ngược lại): lấy tài liệu mới nhất (cuối cùng) từ một bộ sưu tập.

> db.Sports.find().sort({'_id':-1}).limit(1)
{ "_id" : ObjectId("5bfb60b1dea65504b456ab14"), "Type" : "F1", "Head" : "Ferrari Lost Championship", "Body" : "By two positions, Ferrari loses the F1 Championship, leaving the Italians in tears." }

2

php7.1 mongoDB:
$data = $collection->findOne([],['sort' => ['_id' => -1],'projection' => ['_id' => 1]]);


1

Giải pháp của tôi :

db.collection("name of collection").find({}, {limit: 1}).sort({$natural: -1})


0

Nếu bạn đang sử dụng Id đối tượng Mongo được tạo tự động trong tài liệu của mình, nó chứa dấu thời gian trong đó là 4 byte đầu tiên sử dụng tài liệu mới nhất được chèn vào bộ sưu tập có thể được tìm ra. Tôi hiểu đây là một câu hỏi cũ, nhưng nếu ai đó vẫn đang ở đây để tìm kiếm một câu hỏi khác.

db.collectionName.aggregate(
[{$group: {_id: null, latestDocId: { $max: "$_id"}}}, {$project: {_id: 0, latestDocId: 1}}])

Truy vấn trên sẽ cung cấp _id cho tài liệu mới nhất được chèn vào bộ sưu tập


0

Đây là cách lấy bản ghi cuối cùng từ tất cả các tài liệu MongoDB từ bộ sưu tập "foo". (Thay đổi foo, x, y, v.v.)

db.foo.aggregate([{$sort:{ x : 1, date : 1 } },{$group: { _id: "$x" ,y: {$last:"$y"},yz: {$last:"$yz"},date: { $last : "$date" }}} ],{   allowDiskUse:true  })

bạn có thể thêm hoặc xóa khỏi nhóm

bài viết trợ giúp: https://docs.mongodb.com/manual/reference/operator/aggregation/group/#pipe._S_group

https://docs.mongodb.com/manual/reference/operator/aggregation/last/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.