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

12

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

以下代码应该能让你了解我要做什么:

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

仅供参考,大多数答案都是正确的!你无法通过任何MongoDB查询找到集合创建的时间!最好的方法是像建议的那样从_id中获取日期。但在此之前,请检查:集合是否曾经使用$out被删除并重新创建,它不是一个capped collection,没有TTL indexes,也没有启用Online Archive。如果你能说出这句话:“最早的文档已被保留”,那么你很可能没问题! - whoami - fakeFaceTrueSoul
4个回答

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

8
“创建日期”不是集合的元数据的一部分。集合不知道自己何时被创建。一些索引有ObjectId(),暗示着时间戳,但这并不一致且不可靠。因此,我认为这是无法完成的。

我们不能从操作日志中获取那些信息吗? - Sebastien Lorber
1
oplog会随着时间变化而循环,因此,除非您恰好在它创建的那一刻观察它,否则它就不存在了。 - Gates VP

2

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

此外,您可以在集合中插入一个“空”文档以达到此目的,而不必维护另一个集合。

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

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

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

(我使用的是MongoDb 3.6)


我该如何查询一个集合是否有一个 _id 字段,它是否为 ObjectID 类型以及它是否被索引? - Irina Rapoport
只需在该集合上使用查找函数即可。请记住,结果是一个游标。但是您可以使用toArray函数将其转换为数组。例如。resultArray = db.your_collection.find( {_id: ObjectId("633ddca7ed03bf24a61845ed")} ).toArray()(我正在使用MongoDb 5.0) - 0zkr PM

1

看起来像是一些“死帖”,但无论如何:我尝试找到答案并找到了:

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接