2017-02-25 2 views
0

これは私がMongoDBとNoSQLを使って作業した最初のプロジェクトですので、ここでルーキーミスをたくさんしているかもしれません。まず、私が取り組んでいる問題の声明を説明します。ここではJSON複数のクエリフィルタをループ内で動的に一緒にする方法はありますか? MongoDB C#

{ 
    "_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" : [] 
} 

で私のコレクションでの製品の一つの文書とC#

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; } 
} 

でクラスProductであり、ここでのカテゴリーの一つの文書でありますJSONのマイコレクションで

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

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

で10

とクラスCategoryさて、ここで私は何をする必要があるかです。 私はinterestsと呼ばれるList<Category>のリストを持っています。私はカテゴリのリストにあるカテゴリからのコレクションから製品を選択する必要があります。そこでは、取得する各製品には、評価> 0の少なくとも1つの機能が必要で、その機能は付属の機能のリストにも含まれていますカテゴリのリスト内の各カテゴリ。

私はそれが複雑に思われるので、私は助けが必要です。以下のコードは間違っていますが、少し分かりやすく理解してくれるでしょう。このコードをどのように動作させるかを知る必要があります。私は問題を抱えているラインを正確にコメントしています。 Enumerable.All(p.features、 (ProductFeatureのF)=>((f.feature == "パフォーマンス":ここでは

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); 

は私が

サポートされていない句を取得しています例外であります)& &(f .rating> 0)))。

私はフィルタ定義にAny代わりのAllを入れた場合、コードは動作を開始しますが、私は仕事にAllを必要としています。 何か助けていただければ幸いです。

+0

のための製品を取得するためのC#コードを簡略化されています。あなたは 'var q3 = Query .ToList()を試すことができます(p => p.features.All(f => f.feature == interest [i] .Features [j] && f.rating > 0)); ' – Venky

答えて

1

例に基づいて、以下のクエリが必要になります。以下は

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

私は `ユーザーにList`を示唆しているすべてのカテゴリ

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); 
} 
+0

' pQuery = Query.Or(pQuery、cQuery); '行がコードスニペットで動作していませんでした。例外を投げているわけではなく、 'pQuery = {{}}'をデバッグするときに、その行を実行した後であっても。そして、デバッグモードでオブジェクトの中のラッパーをチェックすると、間違ったキャスト例外が発生していました。私は 'if(i == 0)を使って動作させました。 { pQuery = cQuery; } else { pQuery = Query.Or(pQuery、cQuery); } 'と置き換えてください。残りはうまくいった。ありがとうございました。 –

関連する問題