首页 > 解决方案 > 如何通过计算属性过滤 mongodb 集合

问题描述

我有一个SearchableOrder这样定义的模型:

public class SearchableOrder
{
    public string Id { get; set; }

    public string OrderNumber { get; set; }

    public string MarketplaceCode { get; set; }

    public DateTime ShippingDeadline { get; set; }
}

我的任务是实现的功能是允许我们的用户进行一些动态过滤。例如,用户可能希望仅按MarketplaceCode属性过滤或同时按MarketplaceCode属性和ShippingDeadline属性进行过滤。这意味着我不能只编写硬编码查询,而是需要即时构建 mongo 过滤器。此模型中存在的字段很容易,例如为MarketplaceCode属性和 Operator == Equals 构建的过滤器如下所示:

Builders<SearchableOrder>.Filter.Eq(o => o.MarketplaceCode, "MyMarketplaceCode");

如果我想要(并且实际上需要)让用户能够按一些“复杂”标准进行过滤,那么麻烦就开始了。例如,用户可能想要获取ShippingDeadlineX 天内的所有订单。我疯狂地浏览了mongo docs,然后浏览了c# driver docs,发现$where操作是我想要的。或者是吗?当我使用此代码时:

const int MillisecondsInADay = 86400000;
var now = DateTime.UtcNow;
var days = 5; // received from the user input
Builders<SearchableOrder>.Filter.Where(o => (o.ShippingDeadline - now) / MillisecondsInADay > days);

我得到这个异常:System.InvalidOperationException: (({document}{ShippingDeadline} - 24.06.2021 15:50:45) / 86400000) is not supported.这是由MongoDB.Driver.Linq.Translators.PredicateTranslator.GetFieldExpression(Expression expression). 有任何想法吗?Mongo 文档提到(我在原始 mongo 查询中检查它并且它有效)我可以使用$where操作和 javascript 函数,但是 c# 驱动程序的Where方法似乎无法将 c# 代码转换为 mongo js。有什么建议么?

标签: c#mongodbmongodb-.net-driver

解决方案


推荐阅读