私はこのような文書があります:私はフィールド.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オブジェクトを使用してこれを達成する方法がありますか?
文字列として数値を格納しないでください:
投影/並べ替えのコードは次のようになります。数字を数字として保存します。 "5"は "230000"より大きく、 "10000000000"は "230000"より* less *です。 – Servy
これはちょうど私の問題を例示することでした。私はそれに応じて質問を更新します。 – gplumb