Прежде всего, ваш .NET DateTime
хранится как MongoDB string
, что не является поведением по умолчанию. По умолчанию вы должны видеть что-то подобное в вашей базе данных:
"Date" : ISODate("2018-02-01T13:22:08Z")
Таким образом, существует несоответствие между типом, хранящимся в вашей базе данных, и типом, который есть в вашей модели. Имейте в виду, что MongoDB проверяет типы перед значениями, и не существует неявного приведения типа JavaScript.
В вашем рабочем примере вы использовали BsonDocument
, который обрабатывает динамические документы , поэтому драйвер просто игнорировал тип данных, указанный в вашей модели, и он переводился в
db.yourCollection.find({"Date" : "2018-02-01T13:22:08Z"})
и возвращает этот документ.
Второй фрагмент кода использует универсальный Filter
Builder
, поэтому вы указали, что заботитесь о типах в Model
классе.
Вы можете включить профилировщик MongoDB на уровне 2, а затем запустить свой код .NET:
db.setProfilingLevel(2)
Затем вы можете выполнить следующий запрос в вашей базе данных:
db.system.profile.find({ns: "yourdb.yourcollection"}).sort({ts:-1}).limit(1).pretty()
и вы увидите запрос, сгенерированный драйвером:
"command" : {
"find" : "yourcollection",
"filter" : {
"Date" : {
"$in" : [
ISODate("2018-02-01T13:22:08Z")
]
}
},
"$db" : "yourdb"
}
Итак, как вы можете видеть, драйвер знает о DateTime
и преобразует вашу строку в ISODate
, что вызывает несоответствие типов на уровне запросов к базе данных, и поэтому вы не получаете результатов.
Решения? Либо сохраните ваш .NET DateTime
как ISODate
в MongoDB (рекомендуется), либо всегда используйте BsonDocument
для построения ваших запросов.