如何将多个查询过滤器动态地循环在一起?MongoDB C#

雷汉·优素福

这是我第一个使用 MongoDB 和 NoSQL 的项目,所以我知道我可能会在这里犯很多新手错误。好的,首先我将解释我正在处理的问题陈述。这是我在 JSON 中收藏的产品的一个文档

{
    "_id" : ObjectId("58b19bb67425e833c4ca4a65"),
    "features" : [ 
        {
            "feature" : "Performance",
            "rating" : -1
        }, 
        {
            "feature" : "Speed",
            "rating" : -2
        }, 
        {
            "feature" : "Durability",
            "rating" : -1
        }
    ],
    "brand" : "EVGA",
    "stars" : 4,
    "productId" : "B01H0WU884",
    "productName" : "EVGA GeForce GTX 1070 SC GAMING ACX 30 8GB GDDR5 LED DX12 OSD Support PXOC Graphics Card 08G-P4-6173-KR",
    "productDescription" : "The EVGA GeForce GTX 1070 featuring EVGA ACX 3.0 cooling has arrived. This new graphics card features NVIDIA's new \"Pascal\" graphics processor which is the most advanced gaming GPU ever created.",
    "productCategory" : "Hardware",
    "productPrice" : "17000",
    "createdAt" : ISODate("2017-02-25T14:59:02.816Z"),
    "comments" : []
}

ProductC# 中的类

public class Product
{

    public ObjectId id { get; set; }
    public string productId { get; set; }
    public string productName { get; set; }
    public string productDescription { get; set; }
    public string productCategory { get; set; }
    public string productPrice { get; set; }

    public DateTime createdAt { get; set; }

    public List<ProductFeature> features;
    public List<string> comments { get; set; }
    public string brand;
    public int stars;
}

和班级 ProductFeature

public class ProductFeature
{
    public string feature { get; set; }
    public int rating { get; set; }
}

这是我在 JSON 中的集合中的一个类别的文档

{
    "_id" : ObjectId("58b199627425e81e7c56eff1"),
    "Features" : [ 
        "Performance", 
        "Speed", 
        "Durability"
    ],
    "Name" : "Hardware"
}

CategoryC# 中的

public class Category
{
    public List<string> Features { get; set; }
    public string Name { get; set; }
    public ObjectId id { get; set; }
}

现在,这就是我需要做的。我有一个List<Category>名为interests. 我需要从我的类别列表中的类别中选择集合中的产品,其中我获得的每个产品必须至少具有一个评分 > 0 的功能,并且该功能也存在于附加的功能列表中类别列表中的每个类别。

我知道这看起来很复杂,这就是我需要帮助的原因。下面的代码虽然不正确,但会帮助您更好地理解。我需要知道如何使这段代码起作用。我已经准确评论了我遇到问题的行。

    var query = null; // Error: Can't initialize 'var' object to null
    for (int i=0;i<interests.Count;i++)
    {
        var q1 = Query<Controller.Product>.Where(p => p.productCategory == interests[i].Name);
        var q2 = null; // Error: Can't initialize 'var' object to null
        for (int j=0;j<interests[i].Features.Count;j++)
        {
            // Exception on this next line
            var q3 = Query<Controller.Product>.Where(p => p.features.All(f => f.feature == interests[i].Features[j] && f.rating > 0)); 
            q2 = Query.Or(q2, q3);
        }
        query = Query.Or(query, Query.And(q1, q2));

    }
    var result = collection.Find(query).SetLimit(20);

这是我得到的异常

不支持的 where 子句:Enumerable.All(p.features, (ProductFeature f) => ((f.feature == "Performance") && (f.rating > 0)))。

如果我把Any而不是All在过滤器定义中,代码开始工作,但我需要All工作。任何帮助表示赞赏。

s7vr

根据示例,您将需要以下查询。

db.product.find({
    "productCategory": "Hardware",
    "features": {
        "$elemMatch": {
            "feature": {
                "$in": ["Performance",
                    "Speed",
                    "Durability"
                ]
            },
            "rating": {
                "$gt": 5
            }
        }
    }
})

以下是用于获取所有类别产品的简化 C# 代码

var pQuery = Query.Empty;
for (int i = 0; i < interests.Count; i++) {
    var cQuery = Query.And(
        Query<Product>.EQ(u => u.productCategory, interests[i].Name),
        Query<Product>.ElemMatch(f => f.features, e => Query.And(
            Query<ProductFeature>.In(u => u.feature, interests[i].Features),
            Query<ProductFeature>.GT(u => u.rating, 5))));
    pQuery = Query.Or(pQuery, cQuery);
}
var result = collection.Find(pQuery).SetLimit(20);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档