我有一個這樣的文件:MongoDB的C# - 。首先()謂詞未在投影工作
{ "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" ] }] }
我希望能夠對查詢的字段.parent1
,.parent2
並找到第一個匹配在.Items
陣列中的子代碼item2
的值。然後我想將它們拼合成一個投影,這樣我就可以對子數組中的第一個匹配項進行排序(我在投影中稱其爲Instance
)。
所以對於> = 230000搜索值,所產生的比賽會是這個樣子:
{ "Parent1": "foo", "Parent2": "bar", "Instance": "234567" }
在使用LINQ與C#MongoDB的驅動程序(asp.net核心),我試過的東西像這樣:
// 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
,致使分選階段無用(和克給我不好的結果)。
在LINQ中是否有一種替代方法獲得同樣的結果呢?還是有一種方法可以使用C#MongoDB Builder對象實現此目的嗎?
不要儲存數字作爲字符串。將數字存儲爲數字。 「5」大於「230000」,「10000000000」小於「230000」。 – Servy
這只是爲了舉例說明我的問題。我會相應地更新問題。 – gplumb