如何使用MongoDB C#驱动程序获取MongoDB集合的创建日期?

时间:2011-08-16 19:34:53

标签: mongodb mongodb-.net-driver

我需要遍历MongoDB数据库中的所有集合并获取创建每个集合的时间(我知道我可以获取集合中每个对象的时间戳,但我宁愿不去那个如果存在更简单/更快的方法,则路由。)

这可以让你知道我正在做什么:

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

4 个答案:

答案 0 :(得分:5)

据我所知,MongoDB没有跟踪集合创建日期。但是,自己这么做很容易。添加一个简单的方法,就像这样,并在创建新集合时使用它:

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

然后,只要您需要信息,只需查询collectionMetadata集合。或者,如果您想使用类似示例的扩展方法,请执行以下操作:

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

答案 1 :(得分:4)

“创建日期”不是集合元数据的一部分。集合在创建时不会“知道”。某些索引的ObjectId()表示时间戳,但这不一致且不可靠。

因此,我不相信这可以做到。

答案 2 :(得分:0)

就像盖茨先生所说的那样,无法使用元数据...但是您可以获取集合中最旧的文档,并从_id中获取它。

此外,您可以为此目的在集合中插入一个“空”文档,而无需重复维护另一个集合。

很容易获得最早的文档:

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

默认情况下,所有集合在_id字段上都有一个索引,使find高效。

(我使用的是MongoDb 3.6)

答案 3 :(得分:0)

似乎是一些尸检,但无论如何:我试图找到答案并得到它:

在 Mongo shell 中查过,不知道如何在 C# 中使用:

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

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