C# 创建一个MongoDB过滤器查找值的一部分
问题描述
我有一个价格数据列表,我想遍历该列表,找出给定项目的当前价值是否低于其历史预期价格的一半。
我有一个方法,应该返回存储在MongoDB中的以此定价的项目列表:
public List<Sale> GetDeals()
{
var collection = _database.GetCollection<Sale>("listOfSales");
var filter = Builders<Sale>.Filter.Where(sale => sale.currentprice < sale.expectedprice * 0.5);
return collection.Find(filter).ToList();
}
问题是,我遇到了以下错误:
MongoDB.Driver.Linq.ExpressionNotSupportedException: ‘不支持的表达式:0.5 in (Convert(sale.expectedprice, Double) * 0.5),因为无法确定如何序列化常量。’
我的Sale
类的样子是这样的:
using MongoDB.Bson;
using System.Text.Json.Serialization;
public class Sale
{
[JsonPropertyName("_id")]
public ObjectId id { get; set; }
[JsonPropertyName("currentprice")]
public long currentprice { get; set; }
[JsonPropertyName("quantity")]
public long quantity { get; set; }
[JsonPropertyName("expectedprice")]
public long expectedprice { get; set; }
}
在MongoDB中,我可以以更好的方式使用过滤器/聚合器/管道来做到这一点吗?
解决方案
看起来LINQ提供程序不支持这个查询。你可以通过普通/原始的MQL查询来实现。
db.collection.find(
{
expr: {lt:
[
"currentprice",
{multiply: [ "$expectedprice", NumberDecimal("0.5")] }
]
}
})
看看这个。在C#中,你可以这样指定它:
FilterDefinition<Sale> filter = @"
{
expr: {lt:
[
""currentprice"",
{multiply: [ ""$expectedprice"", NumberDecimal(""0.5"")] }
]
}
}";
实际发送到服务器的过滤器将是相同的:
{ "expr" : { "lt" : ["currentprice", { "multiply" : ["$expectedprice", NumberDecimal("0.5")] }] } }
注意,currentprice
和expectedprice
必须与数据库中的名称相同,bson配置例如BsonElement
不会影响MQL表单中的过滤器。此外,类似JsonPropertyName
的属性在这里也没有作用。