C# 为什么MongoDB查询不返回任何结果?(按截止日期过滤)

C# 为什么MongoDB查询不返回任何结果?(按截止日期过滤),c#,mongodb,.net-core,mongodb-query,mongodb-.net-driver,C#,Mongodb,.net Core,Mongodb Query,Mongodb .net Driver,这是我的疑问: public Task<UserStats> GetStatsForUserWithId(string userId, DateTime? cutoffDate = null) { var idFilter = Builders<UserStats>.Filter.Eq(s => s.UserId, userId); var cutoffDateFilter = Builders<UserStats>.Filter.Lt(

这是我的疑问:

public Task<UserStats> GetStatsForUserWithId(string userId, DateTime? cutoffDate = null)
{
    var idFilter = Builders<UserStats>.Filter.Eq(s => s.UserId, userId);
    var cutoffDateFilter = Builders<UserStats>.Filter.Lt(s => s.Timestamp, cutoffDate ?? DateTime.MaxValue);

    return _stats
        .Find(idFilter & cutoffDateFilter)
        .SortByDescending(stats => stats.Timestamp)
        .FirstOrDefaultAsync();
}
以下是存储的实体,以备不时之需:

public class UserStats
{ 
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public string UserId { get; set; }
    public Stats1V1 Stats1V1 { get; set; }
    public Stats2V2 Stats2V2 { get; set; }
    public StatsOverall StatsOverall { get; set; }
    public DateTime Timestamp { get; set; }
}
问题是:当我运行C#查询时,没有得到任何结果。MongoDB查询工作正常,这表明两者之间存在一些我没有看到的差异。这是什么

下面是存储在DB中的示例对象,省略了不相关的字段以保持简短:

{
    "_id" : ObjectId("5ca167ac8c7e7250843553a4"),
    "UserId" : "5ca13b15d74d5633c45a3304",
    "Stats1V1" : {
        // omitted a bunch of fields
    },
    "Stats2V2" : {
        // omitted a bunch of fields
    },
    "StatsOverall" : {
        // omitted a bunch of fields
    },
    "Timestamp" : ISODate("2019-04-01T01:21:48.861Z")
}

编辑:我应该指出,在添加截止日期过滤器之前,查询工作得非常好。排序、Id过滤器等在以前工作过,当我添加新的截止日期过滤器时,一切都停止了工作。

因此,我在同事的帮助下解决了这个问题

事实证明,这实际上是由C#WebAPI控制器方法处理未指定的查询参数的方式造成的。我曾经假设(对于.NET来说是新手),就像C#中没有提供的任何函数参数一样,它默认为null。然而,对于查询参数,情况显然并非如此——它假定默认值为日历的开始

我在将来将空值合并到某个合理的日期中,但是这个操作永远不会执行,因为变量实际上从来都不是空的

当我在调试器中通过它时,我应该已经发现了这一点,但我显然不知怎么错过了它,不知道如何

然而,我想分享帮助我发现问题原因的信息——我使用MongoDB内置的分析工具来追踪问题的原因

通过在MongoDB shell中运行以下行:

db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(2)
要启用评测,请运行我的API调用,然后在Mongo shell中运行以下行:

db.system.profile.find().pretty() 
我能够收到此输出(缩短为重要部分):

请注意,这里的时间戳位于0001年。这让我开始研究它是如何得到这个值的,调试器最终揭示了这一点


希望这种方法能在将来帮助其他人。

你能按照说明进行解释吗。解释应该包括您为C#part执行的查询。你能把它添加到你的问题中吗?当然,我也会在数据库中发布一个实际的数据实例来帮助你,这样你就可以看到数据类型是否匹配了。我不认为这是你想要的:
{\“\u t\”:“AsyncStateMachineBox
1\”,“\u id\”:68,“\StateMachine\”:{1\u state\”:-2,“\t\u builder\”:{source\”:{\“\u t\”:\“FindFluent
2\”,\“Filter\”:{\“\u t\”:\”和FilterDefinition
1\“},\“cancellationToken\”:{},\“Context\:{}}`但这正是我从尝试运行一个解释中得到的答案question@BassinatorFWWI在我的机器上运行了一些我认为在逻辑上相同的东西,它似乎起作用了——我用两个过滤器都得到了结果-所以你不可能远离。道歉如果我陈述你的更新,我会直接去。检查日期本身的格式,并尝试仅使用该字段进行一些更基本的查询。
db.system.profile.find().pretty() 
    "command" : {
        "find" : "stats",
        "filter" : {
            "Timestamp" : {
                "$lt" : ISODate("0001-01-01T00:00:00Z")
            }

// omitted