我有一个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();发布于 2019-02-03 15:13:21
我认为Find有一个“受支持的表达式”列表,这些表达式可以(通过lambda)作为参数使用--具有筛选器的含义。支持的表达式在这里驱动程序的正式文档中列出(例如) .Net。
在C#代码中,您可以使用任何C#有效表达式,但是当使用驱动程序不支持的表达式时,您将获得显示的错误。
您可以重写查询,将DateTime.UtcNow转换为unix时间戳,并将转换后的值作为eq过滤器(long类型)用于x.ViewsToday.Date。
你可以试试这样的东西:
var now = DateTime.UtcNow.ToUnixTimeSeconds();
var results = await Settings.DataBase.GetCollection<Video>("Videos")
.Find(x => x.ViewsToday != null && x.ViewsToday.Date == now)
.ToListAsync();编辑
正如注释中所述,问题是在包含时间信息的Unix时间戳上应用仅日期筛选器。由于.Net MongoDb驱动程序无法将日期转换为字符串应用提供的格式,所以我们可以尝试将前面示例中使用的相反方法应用于当前日的开始和第二天的开始,将==条件转换为基于<和>=的新条件。
var now = DateTime.UtcNow;
var currentDate = now.Date;
var tomorrow = currentDate.AddDays(1);
var left = currentDate.ToUnixTimeSeconds();
var right = tomorrow.ToUnixTimeSeconds();
var results = await Settings.DataBase.GetCollection<Video>("Videos")
.Find(x => x.ViewsToday != null &&
x.ViewsToday.Date >= left &&
x.ViewsToday.Date < right)
.ToListAsync();https://stackoverflow.com/questions/54503824
复制相似问题