如何创建一个过滤器,将嵌套值与mongodb中父集合的值相匹配?

How to create a filter that matches a nested value against a value of the parent collection in mongodb?

提问人:Neo 提问时间:11/17/2023 最后编辑:Neo 更新时间:11/20/2023 访问量:54

问:

请考虑以下集合:

{
   "_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"
      )
   )
);   

这似乎也行不通。

谢谢。

C# MongoDB 查询

评论

0赞 Joe 11/18/2023
您使用的是聚合还是查找?使用文档中另一个字段的值查询一个字段仅适用于聚合。
0赞 Neo 11/18/2023
最初我使用的是 AsQueryable,然后我使用了 Find with builder 查询。我在这两种情况下都使用排序、跳过、限制,并根据请求相互附加一系列过滤器。因此,如果您建议我使用聚合,您能否在上下文中也指导我这样做?谢谢:)
1赞 Joe 11/18/2023
我不太擅长c#。此答案显示了如何使用 $expr 来比较同一文档中的多个字段,但它也不在 c# 中:stackoverflow.com/a/48992965/2282634
0赞 dododo 11/18/2023
请参阅此处如何在 C# 中使用原始 MQL:stackoverflow.com/a/68397480/9492730
0赞 dododo 11/18/2023
此外,请确保在尝试之前使用最新的驱动程序版本

答: 暂无答案