我有一个MongoDB数据库,并且在其中以Unix格式存储日期。
但是当我尝试进行查找并在其中实现过滤器时,它给了我一个错误。
FromUnixTimeSeconds({ViewsToday.Date}).ToString("MM/dd/yyyy") is not supported.
at MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(Expression expression)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateComparison(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.TranslateAndAlso(BinaryExpression node)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.MongoCollectionImpl`1.CreateFindOperation[TProjection](FilterDefinition`1 filter, FindOptions`2 options)
at MongoDB.Driver.MongoCollectionImpl`1.FindAsync[TProjection](IClientSessionHandle session, FilterDefinition`1 filter, FindOptions`2 options, CancellationToken cancellationToken)
at MongoDB.Driver.MongoCollectionImpl`1.UsingImplicitSessionAsync[TResult](Func`2 funcAsync, CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.ToListAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)
我的代码是:
var results = await Settings.DataBase.GetCollection<Video>("Videos")
.Find(x => x.ViewsToday != null && DateTimeOffset.FromUnixTimeSeconds(x.ViewsToday.Date).ToString("MM/dd/yyyy") == DateTime.UtcNow.ToString("MM/dd/yyyy"))
.ToListAsync();
答案 0 :(得分:1)
我认为Find
包含“受支持的表达式”列表,这些列表可以(通过 lambda )用作参数-具有过滤器的含义。
支持的表达式列在(例如).Net驱动程序的官方文档中的here中。
在C#代码中,您可以使用任何C#有效表达式,但是当您使用驱动程序不支持的表达式时,会显示错误。
恕我直言,您可以将将DateTime.UtcNow
转换为unix时间戳的查询重写,并将转换后的值用作eq
的{{1}}过滤器(类型为long
)。
您可以尝试以下操作:
x.ViewsToday.Date
编辑
正如评论中所报告的那样,问题还在于在包含时间信息的Unix时间戳上应用仅日期过滤器。
由于.Net MongoDb驱动程序无法使用提供的格式将日期转换为字符串,因此我们可以尝试将我在上一个示例中使用的相反方法应用于当天的开始和第二天开始,根据var now = DateTime.UtcNow.ToUnixTimeSeconds();
var results = await Settings.DataBase.GetCollection<Video>("Videos")
.Find(x => x.ViewsToday != null && x.ViewsToday.Date == now)
.ToListAsync();
和==
将<
条件转换为新条件:
>=