2017-05-04 11 views
1

私はこのような文書があります:私はフィールド.parent1.parent2に対してクエリを実行し、最初のマッチングを見つけることができるようにしたいMongoDBのC# - 1次回()の投影で働いていない述語

{ "parent1" : "foo", "parent2" : "bar", "parent3" : "ignore", "parent4" : "ignore", "Items": [{ "numbers": [ "item1" : "abc", "item2" : 123457, "item3" : "def" ] }, { "numbers": [ "item1" : "abc", "item2" : 234568, "item3" : "def", ] }, { "numbers": [ "item1" : "abc", "item2" : 999998, "item3" : "def" ] }] }

を値.Itemsの子のitem2の値。私はこれらを投影にフラット化したいので、最初に一致する項目を子配列からソートすることができます(投影ではInstanceと呼ばれています)。

だから> = 230000の検索値のために、結果の一致はこのようなものになります:C#MongoDBのドライバ(asp.netコア)でLINQを使用して

{ "Parent1": "foo", "Parent2": "bar", "Instance": "234567" }

を、私は何かを試してみましたこのように:

// Query stage (Works) 
var query = collection.ToQueryable<T>().Where(x => x.parent1 == "foo" && 
     && x.parent2 == "bar" && x.Items.Any(y => y.numbers.item2 >= 230000)); 

// Projection (Doesn't work) 
var projection = query.AsQueryable().Select(x => new Output() 
{ 
    Parent1 = x.parent1, 
    Parent2 = x.parent2, 
    Instance = x.Items.First(y => y.numbers.item2 >= 230000).item2, 
}); 

// Sort and get results (Would work if the projection above did) 
var result = projection.OrderBy(x => x.Instance).ToList(); 

私が持っている問題はFirst述語は投影では無視されているので、戻ってくる値が0で、無駄な(およびg仕分けステージをレンダリングすることです私に悪い結果を与える)。

LINQで同じことを達成する別の方法があるのですか、それともC#MongoDB Builderオブジェクトを使用してこれを達成する方法がありますか?

+0

文字列として数値を格納しないでください:

投影/並べ替えのコードは次のようになります。数字を数字として保存します。 "5"は "230000"より大きく、 "10000000000"は "230000"より* less *です。 – Servy

+0

これはちょうど私の問題を例示することでした。私はそれに応じて質問を更新します。 – gplumb

答えて

0

MongoDBドライバのソースを見ると、.First()述語が正しく起動することを確認できました。問題の結果の項目に個別のフィールドを使用しています(ドライバは、述語は完全にこの場合です。これが「0」を生成する理由です)。

解決方法この問題を回避するには、目的のプロパティではなく、.First()述語の結果全体を投影し、その後で目的のプロパティを使用するように後続の.OrderBy()句を変更します。

// Projection (Yield the whole object, not just a property from it) 
var projection = query.AsQueryable().Select(x => new Output() 
{ 
    Parent1 = x.parent1, 
    Parent2 = x.parent2, 
    Instance = x.Items.First(y => y.numbers.item2 >= 230000) 
}); 

// Sort and get results (Now just sort on the property we care about) 
var result = projection.OrderBy(x => x.Instance.item2).ToList(); 
関連する問題