【发布时间】:2016-02-06 03:40:06
【问题描述】:
我正在处理具有以下数据结构(简化)的文档: 如您所见,其中包含不同日期时间的消息。可以有重叠的文档,所以一个文档可以有 10 分钟前和 5 分钟前的消息,另一个可以有 15 分钟前和 7 分钟前的消息。 我要查询的是按“最大”日期时间排序的文档。所以我想要一个包含 5 分钟前的文档,然后是包含 7 分钟前的文档等等。
我目前想知道 Azure DocumentDB 是否真的支持这样的东西,因为在属性上订购它并采取第一个、最后一个、MAX'ing 等的任何尝试都失败了。我正在考虑可能将其保存为纪元,因为那将是本机 JSON 类型,但我仍然需要上述 LINQ 方法之一。
我正在使用 LINQ 进行查询,但显然欢迎任何使用 SQL 的见解。我知道这些查询在 Mongo 中是可能的,但目前在网上找不到任何关于此的内容,我的所有努力都被证明是失败的。
{
"id": "02cbd75b-2f75-4050-861d-c2fa63edf3e9",
"Messages": [
{
"DateTime": "2016-01-30T13:17:29.9922386+01:00",
"Content": "Foo"
},
{
"DateTime": "2016-01-30T13:27:29.9942405+01:00",
"Content": "Bar"
},
{
"DateTime": "2016-01-30T13:21:29.9942405+01:00",
"Content": "FooBar"
},
{
"DateTime": "2016-01-30T13:52:29.9942405+01:00",
"Content": "BarFoo"
}
]
}
我尝试过的事情(有几个显然是错误的):
尝试 1:
var threads = client.CreateDocumentQuery<MessageThread>("dbs/" + database.Id + "/colls/" + documentCollection.Id)
.OrderBy(x => x.MessagePosts
.OrderBy(y => y.DateTime)
.FirstOrDefault().DateTime)
.Select(x => x).ToList();
尝试 2:
var threads = client.CreateDocumentQuery<MessageThread>("dbs/" + database.Id + "/colls/" + documentCollection.Id)
.OrderBy(x => x.MessagePosts
.Max(y => y.DateTime))
.Select(x => x).ToList();
尝试 3:
var threads = client.CreateDocumentQuery<MessageThread>("dbs/" + database.Id + "/colls/" + documentCollection.Id)
.OrderBy(x => x.MessagePosts[0].DateTime)
.Select(x => x).ToList();
尝试 4:
var threads = client.CreateDocumentQuery<MessageThread>("dbs/" + database.Id + "/colls/" + documentCollection.Id)
.OrderBy(x => x.MessagePosts
.OrderBy(y => y.DateTime))
.Select(x => x).ToList();
【问题讨论】:
-
你能对客户端进行排序吗?或者,您可以将最大 DateTime 非规范化为文档的根级别吗?
-
对客户端进行排序是可能的,但限制了理想状态,因为如果我们谈论的是半百万条记录,它就会变得有点太多了。对最大 DateTime 进行非规范化也是我目前的想法,但由于消息可能重叠,我会检索到超出需要的内容。我希望文档数据库查询中有一些“本机”可以直接解决它。
-
我很确定没有办法通过单个查询来做到这一点。如果您将 node.js 托管在与 DocumentDB 集合相同的数据中心,那么对“客户端”端进行排序的开销是最小的。我说,首先以最直接的方式进行,然后衡量以评估优化的需求。当然,反规范化在读取时会更有效。但是,它可能会花费您比您想要的更多的写入成本。测量。
-
感谢@LarryMaccherone,这证实了我的想法。我认为现在我将使用非规范化属性。
标签: c# azure-cosmosdb