MongoDB C# - 在嵌套数组中按条件查找对象的过滤器

MongoDB C# - filter for findig object by contiditon in nested array

我在构建过滤器以在嵌套数组中按条件获取对象时遇到问题。

我的模型是:

public class ProductPriceInStore
{
    [BsonId]
    public ObjectId Id { get; set; }

    public ObjectId store { get; set; }

    public ObjectId product { get; set; }

    public string measurementUnit { get; set; }

    public IList<ProductPrices> prices { get; set; }
}

 public class ProductPrices
{
    public double? actualPrice { get; set; }
  
    public double? originalPrice { get; set; }
}

我想做的是找到所有ProductPriceInStore,其中包含实际价格大于原始价格的ProductPrice

我在我的项目中使用 nugget MongoDB.Driver 2.7.3

您可以使用 Linq 查询选择器: 如果您有 ProductPriceInStore 列表,那么您可以这样做:

ProductPriceInStoreList.Where(item => item.prices.Where(p => p.actualPrice  > p.originalPrice   ))

您可以使用以下聚合管道获得所需的结果,因为 $elemMatch 不能用于比较嵌套对象中字段的值 (afaik)。

db.ProductPriceInStore.aggregate(
[
    {
        $set: {
            prices: {
                $filter: {
                    input: "$prices",
                    cond: { $gt: ["$$this.actualPrice", "$$this.originalPrice"] }
                }
            }
        }
    },
    {
        $match: {
            prices: { $gt: [0, { $size: "$prices" }] }
        }
    }
])

但是这样效率不高。一个更好的方法是让你存储一个布尔值 属性 IsGreaterThanOriginalPrice 而你是 creating/saving 嵌套项目,在这种情况下你可以轻松地使用 ElemMatch 没有太多麻烦.

db.ProductPriceInStore.find({$expr:{$gt:["$prices.actualPrice", "$prices.originalPrice"]}})