提问人:Neo 提问时间:11/17/2023 最后编辑:Neo 更新时间:11/20/2023 访问量:54
如何创建一个过滤器,将嵌套值与mongodb中父集合的值相匹配?
How to create a filter that matches a nested value against a value of the parent collection in mongodb?
问:
请考虑以下集合:
{
"_id" : (guid),
"basePrice" : 5000,
"productCategories" : [{
"_id" : (Guid),
"categoryName" : "",
"isActive" : true,
"products" : [{
"_id" : (guid),
"productCode" : "GoKart",
"price" : 5000
}]
}]
}
我正在尝试获取一个集合,其中 basePrice == price 其中 productCategory 处于活动状态。
我尝试了以下 c# 代码:
.Where(
x => x.ProductCategories.Any(pc =>
pc.IsActive &&
pc.Products.Any(p =>
p.Type.ShortCode == "GoKart" &&
p.Price == x.BasePrice
)
)
)
虽然代码看起来没问题,但MongoDB似乎不支持这一点。
然后我尝试使用生成器查询。但是在使用 ElemMatch 时,我不能在 filter 属性中使用 field 属性。
我觉得我完全错了。 由于比较在文档中,因此我们遇到了这个问题。是否可以将集合中的值作为筛选器进行比较并获取文档?我不想把它存入内存,因为记录非常大。
最新我尝试了以下代码:
filterBuilder.And(
Builders<Inventory>.Filter.ElemMatch(inv => inv.ProductCategorys,
Builders<ProductCategory>.Filter.And(
Builders<ProductCategory>.Filter.Eq(pc => pc.IsActive, true),
Builders<ProductCategory>.Filter.ElemMatch(pc => pc.Products,
Builders<Product>.Filter.Eq(p => p.ShortCode, "GoKart")
)
)
),
Builders<Inventory>.Filter.Eq("$expr",
Builders<Inventory>.Filter.Eq(
"$basePrice" ,
"$ProductCategories.Products.Price"
)
)
);
这似乎也行不通。
谢谢。
答: 暂无答案
评论