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"]}})
我在构建过滤器以在嵌套数组中按条件获取对象时遇到问题。
我的模型是:
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"]}})