C创建一个MongoDB过滤器查找值的一部分

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")] }] } }

注意,currentpriceexpectedprice必须与数据库中的名称相同,bson配置例如BsonElement不会影响MQL表单中的过滤器。此外,类似JsonPropertyName的属性在这里也没有作用。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程