c# - 如何通过计算属性过滤 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");
如果我想要(并且实际上需要)让用户能够按一些“复杂”标准进行过滤,那么麻烦就开始了。例如,用户可能想要获取ShippingDeadline
X 天内的所有订单。我疯狂地浏览了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。有什么建议么?
解决方案
推荐阅读
- visual-studio-code - 无法从我的计算机上卸载 vscode
- c++ - 使用没有向量的标准排序对二维数组进行排序
- javascript - Node.js:如何仅读取 txt 文件的最后一个非空行?
- excel - 在 VBA MsgBox 中显示货币格式的最佳方法是什么?
- visual-studio-code - 按 F5 无法在 VS 代码中打开新窗口以调试我的自定义主题
- mysql - TypeError:无法读取未定义的属性“id”。Mysql 插入或更新
- java - 年老代垃圾收集未清除
- cocoa - 具有使用自动布局的动态宽度项目的 NSCollectionView
- hla - HLA 编译 - 可以指定构建目录吗?
- angular - 找不到模块:错误:无法解析“@hapi/hawk”