mongodb ObjectId 생성 시간에 사용
그ObjectId
mongodb 문서에서 기본 키로 사용되는 타임스탬프가 포함되어 있습니다(datembjectid.generation_time은 datetime 개체를 반환합니다).따라서 별도의 생성 타임스탬프를 유지하는 대신 이 생성 시간을 사용할 수 있습니까?이 내장된 타임스탬프를 사용하여 생성 시간별로 정렬하거나 마지막 N개 항목을 효율적으로 쿼리할 수 있는 방법은 무엇입니까?
MongoDB ObjectId에는 타임스탬프가 포함되어 있으므로 개체별로 정렬하려면 '생성된 날짜'로 정렬할 수 있습니다.ID:
items.find.sort( [['_id', -1]] ) // get all items desc by created date.
마지막 30개 항목을 생성하려면 다음 쿼리를 사용할 수 있습니다.
items.find.sort( [['_id', -1]] ).limit(30) // get last 30 createad items
저는 실제로 확신할 수 없습니다. 저는 _id로 주문하는 것이 위에서 설명한 것처럼 작동해야 한다고 생각합니다.나중에 몇 가지 테스트를 만들겠습니다.
업데이트:
네, 그렇습니다._id로 주문하시면 _id 생성일까지 자동으로 주문이 됩니다.저는 c#에서 작은 테스트를 해봤어요, mb 관심 있는 사람:
public class Item
{
[BsonId]
public ObjectId Id { get; set; }
public DateTime CreatedDate { get; set; }
public int Index { get; set; }
}
[TestMethod]
public void IdSortingTest()
{
var server = MongoServer.Create("mongodb://localhost:27020");
var database = server.GetDatabase("tesdb");
var collection = database.GetCollection("idSortTest");
collection.RemoveAll();
for (int i = 0; i <= 500; i++)
{
collection.Insert(new Item() {
Id = ObjectId.GenerateNewId(),
CreatedDate = DateTime.Now,
Index = i });
}
var cursor = collection.FindAllAs<Item>();
cursor.SetSortOrder(SortBy.Descending("_id"));
var itemsOrderedById = cursor.ToList();
var cursor2 = collection.FindAllAs<Item>();
cursor2.SetSortOrder(SortBy.Descending("CreatedDate"));
var itemsOrderedCreatedDate = cursor.ToList();
for (int i = 0; i <= 500; i++)
{
Assert.AreEqual(itemsOrderedById[i].Index, itemsOrderedCreatedDate[i].Index);
}
}
예, BSON ObjectId의 generation_time을 원하는 용도로 사용할 수 있습니다.그렇게,
db.collection.find().sort({ _id : -1 }).limit(10)
마지막으로 만든 항목 10개를 반환합니다.그러나 내장된 타임스탬프의 정확도는 1초이므로 1초 이내에 여러 항목이 생성된 순서대로 저장됩니다.
C# 드라이버를 사용하여 DateTime을 해당 타임스탬프로 변환하는 코드는 다음과 같습니다.
public static ObjectId ToObjectId(this DateTime dateTime)
{
var timestamp = (int)(dateTime - BsonConstants.UnixEpoch).TotalSeconds;
return new ObjectId(timestamp, 0, 0, 0);
}
자세한 내용은 http://www.danharman.net/2011/10/26/mongodb-ninjitsu-using-objectid-as-a-timestamp/ 에서 확인할 수 있습니다.
보낸 사람: http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-DocumentTimestamps
"ObjectId 값을 저장하는 _id 필드에 정렬하는 것은 생성 시간에 따라 정렬하는 것과 거의 동일하지만, 이 관계는 1초 내에 여러 시스템에서 생성된 ObjectId 값에 대해 엄격하지 않습니다."
봐
http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-DocumentTimestamps
가능할 것 같지만, 저는 항상 어떤 개체 ID에 내장된 타임스탬프와 같은 내부 타임스탬프에 의존하는 대신 전용 타임스탬프를 갖는 것을 선호합니다.
7일 이내에 생성된 프로젝트를 쿼리하려면 아래 스니펫을 사용합니다.
db.getCollection('projects').find({
$where: function() {
// last 7 days
return Date.now() - this._id.getTimestamp() < (7 * 24 * 60 * 60 * 1000)
}
}).sort({
'_id': -1
})
지정된 필드가 있는 항목을 가져오려면 다음을 수행합니다.
db.getCollection('projects').find({
$where: function() {
// last 7 days
return Date.now() - this._id.getTimestamp() < (7 * 24 * 60 * 60 * 1000)
}
}).sort({
'_id': -1
}).toArray().map(function(item) {
var res = {};
res['Project Name'] = item.config.label;
res['Author'] = item.author;
res['Created At'] = item._id.getTimestamp().toLocaleDateString();
res['Last Modified Date'] = item.config.lastModifDate.toLocaleString();
return res;
});
다음과 같은 것을 반환합니다.
[{
"Project Name": "Newsletter",
"Author": "larry.chen",
"Created At": "Thursday, January 19, 2017",
"Last Modified Date": "Thursday, January 19, 2017 17:05:40"
}...]
PS: MongoDB에 연결할 때 사용하는 소프트웨어는 Robo 3T입니다.
이것이 당신에게 도움이 되기를 바랍니다.
ObjectId가 시간이 지남에 따라 항상 증가하므로 문서를 작성할 때 방향을 지정하는 데 사용할 수 있다는 사실에만 의존하지 않고 ObjectId를 datetime에 진정으로 사용하고자 하는 사용자를 위해 다음과 같은 방법이 있습니다.
더미 파 만 에 범 날 위 ( 이 썬 가 있 다 수 니 습 만 기 들 필 을 준 터 는 반 하 환 문 를 서 진 를 서 어 어 들 특 정 짜 들 만 ▁a ▁python ▁whose ▁making ▁one ▁documents ▁( ) ▁their ▁range 파 있 ▁to ▁dat 에 다 니 s ▁criteria 습 수 ▁create 더 ▁id ▁by ▁filter ▁in ▁can ObjectID.from_datetime()
예:
# gets docs which were created in last 5 minutes
resp = await collection.update_one({'_id': {'$gte': ObjectId.from_datetime(datetime.utcnow() - timedelta(minutes=5))}},
언급URL : https://stackoverflow.com/questions/5125521/uses-for-mongodb-objectid-creation-time
'programing' 카테고리의 다른 글
Bash에서 따옴표로 묶은 문자열 내에서 환경 변수를 사용하는 방법 (0) | 2023.05.26 |
---|---|
기본적으로 빠른 전달을 해제할 수 있습니까? (0) | 2023.05.26 |
jQuery DataTables 플러그인에서 추가한 검색 모음과 바닥글을 제거하려면 어떻게 해야 합니까? (0) | 2023.05.26 |
Windows 8.1의 고해상도 화면에서 매우 작은 Eclipse 인터페이스 아이콘 (0) | 2023.05.26 |
.NET Core, .NET Framework 및 Xamarin의 차이점은 무엇입니까? (0) | 2023.05.26 |