Tôi biết rằng ObjectIds chứa ngày mà chúng được tạo. Có cách nào để truy vấn khía cạnh này của ObjectId không?
Tôi biết rằng ObjectIds chứa ngày mà chúng được tạo. Có cách nào để truy vấn khía cạnh này của ObjectId không?
Câu trả lời:
Dấu thời gian bật vào ObjectIds bao gồm các truy vấn dựa trên ngày được nhúng trong ObjectId rất chi tiết.
Tóm tắt bằng mã JavaScript:
/* This function returns an ObjectId embedded with a given datetime */
/* Accepts both Date object and string input */
function objectIdWithTimestamp(timestamp) {
/* Convert string date to Date object (otherwise assume timestamp is a date) */
if (typeof(timestamp) == 'string') {
timestamp = new Date(timestamp);
}
/* Convert date object to hex seconds since Unix epoch */
var hexSeconds = Math.floor(timestamp/1000).toString(16);
/* Create an ObjectId with that hex timestamp */
var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");
return constructedObjectId
}
/* Find all documents created after midnight on May 25th, 1980 */
db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });
~/.mongorc.js
tệp của mình để có sẵn khi trình mongo
bao khởi động.
ObjectId(hexSeconds + "0000000000000000");
thànhdb.ObjectID.createFromHexString(hexSeconds + "0000000000000000");
ObjectId()
bằng: require('mongoose').Types.ObjectId()
- require('mongoose')
trường hợp Mongoose được khởi tạo / cấu hình của bạn ở đâu .
Sử dụng hàm inbuilt được cung cấp bởi trình điều khiển mongodb trong Node.js cho phép bạn truy vấn bằng bất kỳ dấu thời gian nào:
var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);
Ngoài ra, để tìm kiếm các bản ghi trước thời điểm hiện tại, bạn chỉ cần làm:
var objectId = new ObjectID(); // or ObjectId in the mongo shell
Nguồn: http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
Trong pymongo
, nó có thể được thực hiện theo cách này:
import datetime
from bson.objectid import ObjectId
mins = 15
gen_time = datetime.datetime.today() - datetime.timedelta(mins=mins)
dummy_id = ObjectId.from_datetime(gen_time)
result = list(db.coll.find({"_id": {"$gte": dummy_id}}))
pymongo
phụ thuộc: epoch_time_hex = format(int(time.time()), 'x')
(đừng quên nối các số 0 cho truy vấn của bạn) Gói thời gian đã được sử dụng ( import time
).
Vì 4 byte đầu tiên của ObjectId đại diện cho dấu thời gian , để truy vấn bộ sưu tập của bạn theo trình tự thời gian, chỉ cần sắp xếp theo id:
# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)
Sau khi bạn nhận được tài liệu, bạn có thể có được thời gian tạo thế hệ của ObjectId như sau:
id = some_object_id
generation_time = id.generation_time
Cách tìm Tìm Lệnh (ngày này [2015-1-12] đến Ngày này [2015-1-15]):
db.collection.find ({_ id: {$ gt: ObjectId (Math.floor ((Ngày mới ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((Ngày mới ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}}). Khá ()
Đếm Lệnh (ngày này [2015-1-12] đến Ngày này [2015-1-15]):
db.collection.count ({_ id: {$ gt: ObjectId (Math.floor ((Ngày mới ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((Ngày mới ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})
Xóa Lệnh (ngày này [2015-1-12] đến Ngày này [2015-1-15]):
db.collection.remove ({_ id: {$ gt: ObjectId (Math.floor ((Ngày mới ('2015/1/12')) / 1000) .toString (16) + "0000000000000000"), $ lt: ObjectId (Math.floor ((Ngày mới ('2015/1/15')) / 1000) .toString (16) + "0000000000000000")}})
Bạn có thể dùng $convert
chức năng để trích xuất ngày từ ObjectId bắt đầu từ phiên bản 4.0.
Cái gì đó như
$convert: { input: "$_id", to: "date" }
Bạn có thể truy vấn vào ngày so sánh giữa thời gian bắt đầu và kết thúc cho ngày.
db.collectionname.find({
"$expr":{
"$and":[
{"$gte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T00:00:00.000Z")]},
{"$lte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T11:59:59.999Z")]}
]
}
})
HOẶC LÀ
Bạn có thể sử dụng tốc ký $toDate
để đạt được điều tương tự.
db.collectionname.find({
"$expr":{
"$and":[
{"$gte":[{"$toDate":"$_id"}, ISODate("2018-07-03T00:00:00.000Z")]},
{"$lte":[{"$toDate":"$_id"},ISODate("2018-07-03T11:59:59.999Z")]}
]
}
})
Để có được tài liệu cũ 60 ngày qua trong bộ sưu tập mongo tôi đã sử dụng bên dưới truy vấn trong shell.
db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})
Nếu bạn muốn thực hiện một truy vấn phạm vi, bạn có thể làm điều đó như trong bài viết này . Ví dụ: truy vấn cho một ngày cụ thể (ví dụ: ngày 4 tháng 4 năm 2015):
> var objIdMin = ObjectId(Math.floor((new Date('2015/4/4'))/1000).toString(16) + "0000000000000000")
> var objIdMax = ObjectId(Math.floor((new Date('2015/4/5'))/1000).toString(16) + "0000000000000000")
> db.collection.find({_id:{$gt: objIdMin, $lt: objIdMax}}).pretty()
Từ tài liệu:
o = new ObjectId()
date = o.getTimestamp()
Bằng cách này, bạn có ngày là ISODate.
Hãy xem http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield . để biết thêm thông tin
Sử dụng MongoObjectID, bạn cũng sẽ tìm thấy kết quả như được đưa ra dưới đây
db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});
Trong đường ray, mongoid
bạn có thể truy vấn bằng cách sử dụng
time = Time.utc(2010, 1, 1)
time_id = ObjectId.from_time(time)
collection.find({'_id' => {'$lt' => time_id}})