1

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

我的模型是:

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,实际价格大于 originalPrice

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

4

3 回答 3

0

您可以使用 Linq 查询选择器:如果您有 ProductPriceInStore 列表,那么您可以执行以下操作:

ProductPriceInStoreList.Where(item => item.prices.Where(p => p.actualPrice  > p.originalPrice   ))
于 2021-01-11T09:09:17.880 回答
0

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

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

然而,这不会是有效的。更好的方法是让IsGreaterThanOriginalPrice您在创建/保存嵌套项目时存储布尔属性,在这种情况下,您可以轻松使用ElemMatch而无需太多麻烦。

于 2021-01-11T11:30:50.110 回答
0
db.ProductPriceInStore.find({$expr:{$gt:["$prices.actualPrice", "$prices.originalPrice"]}})
于 2021-01-12T15:04:24.537 回答