DocumentDb:获取第一个文档

时间:2015-09-12 11:47:43

标签: azure-cosmosdb

是否有一种从查询中获取第一个文档的有效方法?通常,这将使用LINQ收集的FirstOrDefault()或SQL中的TOP

假设集合看起来像这样:

{
    name: "John",
    position: 3
},
{
    name: "Mary",
    position: 1
},
{
    name: "Peter",
    position: 2
}

我只需要检索具有最高值位置的单个文档。即这种情况下的“玛丽”文件。

使用C#SDK,我必须执行以下操作:

Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
    .Where(somethingOtherCriteria);
    .OrderByDescending(x => x.Position)
    .AsEnumerable()
    .FirstOrDefault());

这将检索集合中的所有文档(在应用相关过滤器之后),然后从列表中获取第一个文档。这仍然可以通过网络带来数以千计的无关文件。

是否无法在服务器上执行FirstOrDefault()

4 个答案:

答案 0 :(得分:2)

一个选项是将最大响应大小设置为1,并仅从查询迭代器中获取第一页:

var query = client.CreateDocumentQuery<Family>(collectionLink, "SELECT * FROM myCollection", new FeedOptions { MaxItemCount = 1 }).AsDocumentQuery();
var feedResponse = await query.ExecuteNextAsync<Family>();

答案 1 :(得分:0)

您正在寻找Take(),这是在查询中映射到TOP的Linq函数。所以你想要像

这样的东西
        var query = client.CreateDocumentQuery<MyType>(collectionAddress)
            .Where(x => x.Value == myValue)
            .Take(1);

答案 2 :(得分:0)

您已经关闭。跳过AsEnumerable()并执行以下操作:

List<Integer> buffet = Collections.synchronizedList(new ArrayList<>());
...
while (true) {
    synchronized (buffet) {
        // perform your operations
    }
}

如果以这种方式执行操作,则实际上不会返回任何结果,而是您想要的结果。问题是,您必须对结果的每一页都运行ExecuteNextAsync(),直到获得具有所需结果的页面为止-但其他结果不会通过网络传递,也不会反序列化为C#引用类型

答案 3 :(得分:0)

根据https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/6771773-add-support-for-single-entity-retrieval-instead-of

Client.CreateDocumentQuery<T>(Collection.DocumentsLink)
    .Where(somethingOtherCriteria);
    .OrderByDescending(x => x.Position)
    .Take(1)
    .AsEnumerable()
    .FirstOrDefault());