【问题标题】:Find documents older than x months with mongodb in C#在 C# 中使用 mongodb 查找超过 x 个月的文档
【发布时间】:2020-03-15 16:57:56
【问题描述】:

我正在尝试在 mongodb 中查询超过 X 个月的文档。我没有明确的创建日期字段,也没有权限。

我尝试使用 Mongo ObjectId 的 CreationTime 属性,但出现异常 System.InvalidOperationException: Unable to determine the serialization information for f => f.Id.CreationTime.

我做了一个函数来做查询:

public async Task<int> GetReportCountXmonths(string name, int months)
{
    await GetCollection<Clients>()
        .Find(Builders<Clients>.Filter.Eq(d => d.name, name) 
            & Builders<Clients>.Filter.Gte(f => f.Id.CreationTime, DateTime.Now.AddMonths(-(months))))
        .CountDocumentsAsync();
}

问题:如何使用 C# 在 MongoDB 集合中找到 X 个月之前的文档?

【问题讨论】:

  • 检查以下答案。

标签: c# mongodb mongodb-query mongodb-.net-driver


【解决方案1】:

MongoDB 不跟踪集合的创建日期。但是,自己做这件事真的很容易。在 mongdb 集合中添加 createddate 字段。 另一种方法是使用objectId,它意味着时间戳,但这不是一种一致的方式。

如果你真的想使用 objectId。将你对应的日期转换为objectId 并使用此 objectId 和集合 objectId 进行查询。

 var sampledate=new Date("requireddate");
 var testobjectId =Math.floor(date.getTime() / 1000).toString(16) +"0000000000000000"; 
  db.comments.find({_id: {$gt:testobjectId }})  ;

将上述方法转换成c#。

【讨论】:

  • 如果只是针对单个文档,我不会有任何问题,但是正如您所见,我得到了一个集合,所有这些都匹配。我不明白如何应用您在我的查询中提出的建议。
  • var cticks = DateTime.Now.Ticks; var jticks = (cticks - 621355968000000000) / 10000; var testobjectId = Convert.ToString(jsticks / 1000, 16) + "0000000000000000";使用 testobjectId 进行查询
  • @Jeppe 您必须将 C# 记号转换为 javascript 记号。试试上面的代码
  • 我可以 :) 这么多工作只是因为我没有看到 ObjectId 构造函数-_-
  • 我才意识到这次的滴答声问题实际上是 MS 故障,它们的 DateTime 对象不遵循普遍接受的 Unix 标准
【解决方案2】:

在@Thaks 的大力帮助下,我找到了答案!

我需要直接与 id 进行比较,而不是 id 上的 CreationTime 属性。

public async Task<int> GetReportCountXmonths(string name, int months)
{
    var limit = new ObjectId(DateTime.Now.AddMonths(-(months)), 0, 1, 2);

    await GetCollection<Clients>()
        .Find(Builders<Clients>.Filter.Eq(d => d.name, name) 
            & Builders<Clients>.Filter.Gte(f => f.Id, limit)
        .CountDocumentsAsync();
}

【讨论】:

    猜你喜欢
    • 2021-07-05
    • 1970-01-01
    • 2015-05-21
    • 2013-02-06
    • 2014-03-02
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    相关资源
    最近更新 更多