programing

mongodb ObjectId 생성 시간에 사용

abcjava 2023. 5. 26. 20:24
반응형

mongodb ObjectId 생성 시간에 사용

ObjectIdmongodb 문서에서 기본 키로 사용되는 타임스탬프가 포함되어 있습니다(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

반응형