2017-11-17 128 views
0

我正在使用Couchbase v4.5和.NET SDK 2.3.8版。我正在將視圖遷移到N1QL查詢中。可用於視圖的Javascirpt爲我提供了對文檔的數組成員進行排序的靈活性,並隨後從數組中選擇了單個元素。因此,儘管在我看來我有:選擇特定數組元素

'Username': doc.Document.LogActions.sort(function(a,b){ return (a.Time > b.Time) })[doc.Document.LogActions.length - 1].Username 

...我現在正努力通過在N1QL查詢中的.NET SDK來完成相同的操作。需要注意的是,我正試圖在LINQ中完成此操作。我意識到我可以使用原始字符串查詢,它提供了完整的N1QL支持,但團隊負責人希望通過LINQ完成此操作......除非絕對沒有辦法通過LINQ來完成。

我已經試過如下:

排序 - 不允許在數組中的對象上由一個屬性進行排序

Username = doc.Document.LogActions 
         .OrderByDescending(logAction => logAction.Time) 
         .FirstOrDefault() 
         .Username, 

就拿剛剛過去的 - 最後不支持

Username = transaction.Document.LogActions 
           .LastOrDefault() 
           .Username, 

不分揀 - Stil升返回數組

Username = transaction.Document 
         .LogActions[transaction.Document.LogActions.Count - 1] 
         .Username 

我能想到做的僅僅是返回數組回到.NET和做過濾有唯一的其他東西。但是,我們沒有平均數量爲多少個項目的基線。我們寧願避免帶回我們不需要的數據。

我有沒有使用原始字符串查詢?理想情況下,我試圖根據Time屬性從數組中找到最近的「日誌操作」。

回答

1

我打得周圍的一些多用這種,雖然它看起來像這樣的事情應該工作:

Username = transaction.Document.LogActions 
           .OrderByDescending(logAction => logAction.Time) 
           .Select(g => g.Username) 
           .ToArray()[0], 

...唉,事實並非如此。我收到「僅支持數組元素排序的N1Ql數組子查詢」錯誤。所以我試圖用一個GroupBy - 用於笑聲 - 你瞧我得到返回結果:

Username = transaction.Document.LogActions 
           .OrderByDescending(logAction => logAction.Time) 
           .GroupBy(logAction => new { logAction.Time, logAction.Username }) 
           .Select(g => g.Key.Username) 
           .ToArray()[0], 

這讓我確認我得到的正確結果回來 - 因爲CB的排序似乎有點won - - 但它至少是半工作的。

0

我不是LINQ專家。但以下是N1QL查詢。

MAX,MIN參數允許數組。數組的第0個元素可以是字段需要聚合的,第1個元素是你想要的。使用這種技術,您可以像下面那樣爲MIN/MAX投影非聚合字段。

INSERT INTO default VALUES ("k01",{ "logActions":[ { "User":"u1", "Time":"2017-11-52T14:35:00Z" }, { "User":"u2", "Time":"2017-11-09T14:35:00Z" }, { "User":"u3", "Time":"2017-11-03T14:35:00Z" }, { "User":"u4", "Time":"2017-11-02T14:35:00Z" }, ] }); 
SELECT MAX([u.Time,u.User])[1] AS User FROM default d USE KEYS "k01" UNNEST d.logActions AS a; 

使用N1QL子查詢表達式就可以實現這個https://developer.couchbase.com/documentation/server/current/n1ql/n1ql-language-reference/subqueries.html而且檢出N1QL : Find latest status from an array

在5.0.0。