2017-11-17 177 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。