在 mongo DB 查询中使用自定义条件进行过滤不起作用

问题描述 投票:0回答:1

我有一个带有日期时间字段的集合。我想用 id 和 datetime 字段过滤数据。需要检查以毫秒为单位的差异。但出现以下错误

未处理的异常。 System.InvalidOperationException:无法确定 s => (DateTime.UtcNow - s.BilledDateTime.Value).TotalMilliseconds 的序列化信息。 在 MongoDB.Driver.Linq.Linq2Implementation.LinqProviderAdapterV2.TranslateExpressionToField[TDocument,TField](Expression

1 expression, IBsonSerializer
1 documentSerializer, IBsonSerializerRegistry 序列化器注册表,布尔值allowScalarValueForArrayField) 在 MongoDB.Driver.ExpressionFieldDefinition
2.Render(IBsonSerializer
1 documentSerializer、IBsonSerializerRegistry 序列化器Registry、LinqProvider linqProvider、布尔值allowScalarValueForArrayFie ld)

 var builder = Builders<T>.Filter;
            var filter = builder.Where(t =>
                t.Status == 1
            );
            filter &= builder.Gte(s => (DateTime.UtcNow - s.BilledDateTime.Value).TotalMilliseconds, 10000);
            return await Collection.Find(filter).ToListAsync();
c# mongodb-query
1个回答
0
投票

当前的过滤器实际上是对 Mongo 驱动程序的请求,计算每个文档的

now - BilledDateTime
值,然后查看结果是否 >= 10000 毫秒。 C# 驱动程序不支持这种方式的查询,并且将每个文档作为过滤器的一部分逐一评估并不是一个明智的想法。

不过,这其实是微不足道的。您的目标是查找 10000 毫秒前的计费日期。一个简单的解决方案是预先计算 10000 毫秒前的日期和时间值:

var threshold = DateTime.UtcNow.AddMilliseconds(-10000);

我们可以在查询中使用它,如果该属性已建立索引,数据库可以使用索引,从而实现更高效的查询:

filter &= builder.Lt(s => s.BilledDateTime.Value, threshold);
© www.soinside.com 2019 - 2024. All rights reserved.