Igor Pashchuk
Igor Pashchuk

Reputation: 2491

How do I get the date a MongoDB collection was created using MongoDB C# driver?

I need to iterate through all of the collections in my MongoDB database and get the time when each of the collections was created (I understand that I could get the timestamp of each object in the collection, but I would rather not go that route if a simpler/faster method exists).

This should give you an idea of what I'm trying to do:

MongoDatabase _database;
// code elided
var result = _database.GetAllCollectionNames().Select(collectionName =>
    {
        _database.GetCollection( collectionName ) //.{GetCreatedDate())
    });

Upvotes: 13

Views: 20103

Answers (4)

Vladimir Yakovenko
Vladimir Yakovenko

Reputation: 91

Seems like it's some necroposting but anyway: I tried to find an answer and got it:

Checked it in Mongo shell, don't know how to use in C#:

// db.payload_metadata.find().limit(1)

ObjectId("60379be2bec7a3c17e6b662b").getTimestamp()
ISODate("2021-02-25T12:45:22Z")

Upvotes: 1

0zkr PM
0zkr PM

Reputation: 863

Like Mr. Gates VP say, there is no way using the metadata... but you can get the oldest document in the collection and get it from the _id.

Moreover, you can insert an "empty" document in the collection for that purpose without recurring to maintain another collection.

And it's very easy get the oldest document:

old = db.collection.find({}, {_id}).sort({_id: 1}).limit(1) dat = old._id.getTimestamp()

By default, all collection has an index over _id field, making the find efficient.

(I using MongoDb 3.6)

Upvotes: 2

Chris Fulstow
Chris Fulstow

Reputation: 41872

As far as I know, MongoDB doesn't keep track of collection creation dates. However, it's really easy to do this yourself. Add a simple method, something like this, and use it whenever you create a new collection:

public static void CreateCollectionWithMetadata(string collectionName)
{
    var result = _db.CreateCollection(collectionName);
    if (result.Ok)
    {
        var collectionMetadata = _db.GetCollection("collectionMetadata");
        collectionMetadata.Insert(new { Id = collectionName, Created = DateTime.Now });
    }
}

Then whenever you need the information just query the collectionMetadata collection. Or, if you want to use an extension method like in your example, do something like this:

public static DateTime GetCreatedDate(this MongoCollection collection)
{
    var collectionMetadata = _db.GetCollection("collectionMetadata");
    var metadata = collectionMetadata.FindOneById(collection.Name);
    var created = metadata["Created"].AsDateTime;
    return created;
}

Upvotes: 8

Gates VP
Gates VP

Reputation: 45277

The "creation date" is not part of the collection's metadata. A collection does not "know" when it was created. Some indexes have an ObjectId() which implies a timestamp, but this is not consistent and not reliable.

Therefore, I don't believe this can be done.

Upvotes: 8

Related Questions