首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不支持MongoDB查找/异常

不支持MongoDB查找/异常
EN

Stack Overflow用户
提问于 2019-02-03 14:26:05
回答 1查看 2.5K关注 0票数 0

我有一个MongoDB数据库,其中我用Unix格式存储日期。

但是,当我试图在其中查找并实现一个过滤器时,它会给出一个错误。

代码语言:javascript
复制
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)

我的代码是:

代码语言:javascript
复制
    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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-03 15:13:21

我认为Find有一个“受支持的表达式”列表,这些表达式可以(通过lambda)作为参数使用--具有筛选器的含义。支持的表达式在这里驱动程序的正式文档中列出(例如) .Net。

在C#代码中,您可以使用任何C#有效表达式,但是当使用驱动程序不支持的表达式时,您将获得显示的错误。

您可以重写查询,将DateTime.UtcNow转换为unix时间戳,并将转换后的值作为eq过滤器(long类型)用于x.ViewsToday.Date

你可以试试这样的东西:

代码语言:javascript
复制
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驱动程序无法将日期转换为字符串应用提供的格式,所以我们可以尝试将前面示例中使用的相反方法应用于当前日的开始和第二天的开始,将==条件转换为基于<>=的新条件。

代码语言:javascript
复制
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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54503824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档