uses for mongodb ObjectId creation time

前端 未结 6 1763
逝去的感伤
逝去的感伤 2020-12-04 11:04

The ObjectId used as the default key in mongodb documents has embedded timestamp (calling objectid.generation_time returns a datetime object). So it is possible

相关标签:
6条回答
  • 2020-12-04 11:16

    See

    http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-DocumentTimestamps

    Likely doable however I would always prefer having a dedicated timestamp instead of relying on some such internals like timestamp somehow embedded in some object id.

    0 讨论(0)
  • 2020-12-04 11:17

    The code to convert a DateTime to its corresponding timestamp with the c# driver is as follows:

        public static ObjectId ToObjectId(this DateTime dateTime)
        {
            var timestamp = (int)(dateTime - BsonConstants.UnixEpoch).TotalSeconds;
            return new ObjectId(timestamp, 0, 0, 0);
        }
    

    More info here: http://www.danharman.net/2011/10/26/mongodb-ninjitsu-using-objectid-as-a-timestamp/

    0 讨论(0)
  • 2020-12-04 11:18

    To query projects created within 7 days, I use below snippet:

    db.getCollection('projects').find({
      $where: function() {
        // last 7 days
        return Date.now() - this._id.getTimestamp() < (7 * 24 * 60 * 60 * 1000)
      }
    }).sort({
      '_id': -1
    })
    

    and if you want to get items with specified fields:

    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;
    });
    

    it will return something like this:

    [{
      "Project Name": "Newsletter",
      "Author": "larry.chen",
      "Created At": "Thursday, January 19, 2017",
      "Last Modified Date": "Thursday, January 19, 2017 17:05:40"
    }...]
    

    PS: the software I use to connect to MongoDB is Robo 3T

    Hope this will help you.

    0 讨论(0)
  • 2020-12-04 11:22

    Yes, you can use the generation_time of BSON ObjectId for the purposes you want. So,

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

    will return the last 10 created items. However, since the embedded timestamps have a one second precision, multiple items within any second are stored in the order of their creation.

    0 讨论(0)
  • 2020-12-04 11:34

    I suppose since MongoDB ObjectId contain a timestamp, you can sort by 'created date' if you will sort by objectId:

    items.find.sort( [['_id', -1]] ) // get all items desc by created date.
    

    And if you want last 30 created items you can use following query:

    items.find.sort( [['_id', -1]] ).limit(30) // get last 30 createad items 
    

    I am actualy not sure,i just suppose that ordering by _id should work as described above. I'll create some tests later.

    Update:

    Yes it is so. If you order by _id you will automatically order by _id created date. I've done small test in c#, mb someone interest in it:

      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);
       }
    }
    
    0 讨论(0)
  • 2020-12-04 11:41

    From: http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-DocumentTimestamps

    "sorting on an _id field that stores ObjectId values is roughly equivalent to sorting by creation time, although this relationship is not strict with ObjectId values generated on multiple systems within a single second."

    0 讨论(0)
提交回复
热议问题