날짜별로 MongoDB ObjectId를 조회할 수 있습니까?
ObjectId에는 작성된 날짜가 포함되어 있습니다.ObjectId의 이 측면을 쿼리할 수 있는 방법이 있습니까?
ObjectId에 타임스탬프를 팝핑하면 ObjectId에 포함된 날짜에 기반한 쿼리가 매우 상세하게 표시됩니다.
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') } });
인pymongo
다음과 같이 할 수 있습니다.
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}}))
Node.js의 mongodb 드라이버에 의해 제공되는 삽입 함수를 사용하면 다음과 같은 타임스탬프로 조회할 수 있습니다.
var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);
또는 현재 시간 전에 레코드를 검색하려면 다음 작업을 수행합니다.
var objectId = new ObjectID(); // or ObjectId in the mongo shell
출처 : http://mongodb.github.io/node-mongodb-native/api-bson-generated/objectid.html
4.0 버전부터는 함수를 사용하여 ObjectId에서 날짜를 추출할 수 있습니다.
뭐랄까
$convert: { input: "$_id", to: "date" }
날짜에 대해 시작 시간과 종료 시간을 비교하여 조회할 수 있습니다.
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")]}
]
}
})
또는
속기법을 사용하여 동일한 결과를 얻을 수 있습니다.
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")]}
]
}
})
명령어 검색 방법(이것)date[2015-1-12]
여기에Date[2015-1-15]
):
db.collection.find({
_id: {
$gt: ObjectId(Math.floor((new Date('2015/1/12'))/1000).toString(16) + "0000000000000000"),
$lt: ObjectId(Math.floor((new Date('2015/1/15'))/1000).toString(16) + "0000000000000000")
}
}).pretty()
명령어 카운트(이것)date[2015-1-12]
여기에Date[2015-1-15]
):
db.collection.count({
_id: {
$gt: ObjectId(Math.floor((new Date('2015/1/12'))/1000).toString(16) + "0000000000000000"),
$lt: ObjectId(Math.floor((new Date('2015/1/15'))/1000).toString(16) + "0000000000000000")
}
})
명령어 삭제(이것)date[2015-1-12]
여기에Date[2015-1-15]
):
db.collection.remove({
_id: {
$gt: ObjectId(Math.floor((new Date('2015/1/12'))/1000).toString(16) + "0000000000000000"),
$lt: ObjectId(Math.floor((new Date('2015/1/15'))/1000).toString(16) + "0000000000000000")
}
})
ObjectId의 처음 4바이트는 타임스탬프를 나타내므로 수집을 시간순으로 쿼리하려면 단순히 ID로 정렬합니다.
# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)
문서를 가져오면 다음과 같이 ObjectId 생성 시간을 얻을 수 있습니다.
id = some_object_id
generation_time = id.generation_time
예, 삽입된 MongoDB ID를 사용하여 날짜별로 객체를 쿼리할 수 있습니다.
db.collectionname.find({_id: {$lt: ObjectId.fromDate( new ISODate("TZformat") ) } });
사용자가 내 컬렉션이고 2018년 1월 5일 이전에 생성된 모든 사용자를 가정해 보겠습니다.
db.users.find({_id: {$lt: ObjectId.fromDate( new ISODate("2018-01-05T00:00:00.000Z") ) } });
쿼리에서 실행할 경우 다음과 같이 사용할 수 있습니다.
db.users.find({_id: {$lt: ObjectId.fromDate(new Date((new Date().getTime() - (1 * 3 * 60 * 60 * 1000))) ) } })
현재 시각의 모든 사용자 - 3시간
mongo 컬렉션에서 60일 전 문서를 얻기 위해 아래 셸에서 쿼리를 사용했습니다.
db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})
범위 쿼리를 작성하려면 이 게시물과 같이 할 수 있습니다.예를 들어 특정 날짜(2015년 4월 4일)에 대한 쿼리:
> 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()
매뉴얼에서 다음 항목을 참조하십시오.
o = new ObjectId()
date = o.getTimestamp()
이 방법으로 이소데이트라는 날짜를 얻을 수 있습니다.
http://www.mongodb.org/display/DOCS/Optimizing+Object+IDs#OptimizingObjectIDs-Extractinsertiontimesfromidratherthanhavingaseparatetimestampfield 를 참조해 주세요.자세한 정보는
Mongo Object 사용ID는 다음과 같은 결과도 찾을 수 있습니다.
db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});
MongoDB 나침반 내에서의 솔루션 필터링.
버전 기준:
- 나침반 버전: 1.25.0
- MongoDB 버전: 4.2.8
옵션 1:
@s7vr의 답변은 나에게 딱 들어맞았다.[ Filter ]필드에 붙여넣을 수 있습니다.
{$expr: { $and: [ {$gte: [{$toDate: "$_id"}, ISODate('2021-01-01')]}, {$lt: [{$toDate: "$_id"}, ISODate('2021-02-01')]} ] } }
옵션 2:
이것도 동작하고 있습니다(Date's month 파라미터는 0 베이스 인덱스이므로 1월은 0입니다).
{_id: {$gte: ObjectId(Date(2021, 0, 1) / 1000), $lt: ObjectId(Date(2021, 1, 1) / 1000) } }
옵션 3:
이소데이트와 동등:
{_id: {$gte: ObjectId(ISODate('2021-01-01') / 1000), $lt: ObjectId(Date('2021-02-01') / 1000) } }
이 투고를 작성한 후 이 쿼리에 대한 설명을 실행하기로 결정했습니다.퍼포먼스에 대한 자세한 내용은 다음과 같습니다.
- 옵션 1: 39 ms, 0 인덱스 사용, 30 ms (COLSCAN)
- 옵션 2: 0 ms, _id 인덱스 사용
- 옵션 3: 1 ms, _id 인덱스 사용, FETCH에서 1 ms
기본적인 분석에 따르면 옵션 2가 가장 효율적인 것 같습니다.날짜 오브젝트에 0-based month indexing을 기억하는 것보다 ISODate를 사용하는 것이 조금 깨끗하기 때문에 개인적으로 Option 3을 사용합니다.
내 ★★★★mongoid
를 사용해서 할 수 .
time = Time.utc(2010, 1, 1)
time_id = ObjectId.from_time(time)
collection.find({'_id' => {'$lt' => time_id}})
언급URL : https://stackoverflow.com/questions/8749971/can-i-query-mongodb-objectid-by-date
'source' 카테고리의 다른 글
리액트 라우터 v4 - GET할 수 없음 *url* (0) | 2023.02.26 |
---|---|
Zuul 예외 사용자 지정 (0) | 2023.02.26 |
사용자 지정 게시 유형을 표시하는 워드프레스 검색 중지 (0) | 2023.02.26 |
iPhone용 Objective-C에서 Google Directions API polylines 필드를 lat long 포인트로 디코딩하는 방법은 무엇입니까? (0) | 2023.02.26 |
AngularJS: 컨트롤러에서 특정 양식 입력 필드를 비활성화할 수 있습니까? (0) | 2023.02.26 |