【问题标题】:How do I get the date a MongoDB collection was created using MongoDB C# driver?如何获取使用 MongoDB C# 驱动程序创建 MongoDB 集合的日期?
【发布时间】:2011-08-16 19:34:53
【问题描述】:

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

这应该让您了解我正在尝试做什么:

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

【问题讨论】:

  • JFYI,同意大多数答案!您无法找到使用任何 MongoDB 查询创建集合的时间!您最好的选择是按照建议从_id 获取日期。但在此之前 check:: 集合从未使用$out 删除和重新创建,它不是capped collection,不是TTL indexes,不是Online Archive enabled。如果你可以这样说::Oldest doc was preserved 那么你很可能是好人!

标签: mongodb mongodb-.net-driver


【解决方案1】:

据我所知,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;
}

【讨论】:

    【解决方案2】:

    “创建日期”不是集合元数据的一部分。集合不“知道”何时创建。一些索引有一个ObjectId(),这意味着一个时间戳,但这并不一致且不可靠。

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

    【讨论】:

    • 我们不能从 oplog 中获取该信息吗?
    • oplog 随着时间的推移而循环,所以除非你碰巧在它创建的那一刻看到它,否则它根本不存在。
    【解决方案3】:

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

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

    而且很容易得到最旧的文档:

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

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

    (我使用的是 MongoDb 3.6)

    【讨论】:

      【解决方案4】:

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

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

      // db.payload_metadata.find().limit(1)
      
      ObjectId("60379be2bec7a3c17e6b662b").getTimestamp()
      ISODate("2021-02-25T12:45:22Z")
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-09
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        • 2016-08-09
        • 2019-11-12
        相关资源
        最近更新 更多