【问题标题】:Query cosmos db document to filter documents查询 cosmos db 文档过滤文档
【发布时间】:2021-07-19 11:22:37
【问题描述】:

我正在从我的 cosmos db sql api 集合中读取所有文档,并且我想过滤掉那些在 json 中定义了特定属性的文档。因此,如果文档属于此架构

{
id: 1
name: aaa
project: ssdf
}

我想过滤掉其中包含“项目”属性的文档。到目前为止,我的代码可以从集合中读取文档:

 do
            {
                var feed = await client.ReadDocumentFeedAsync(
                    UriFactory.CreateDocumentCollectionUri( SourceDatabase, SourceCollection ),
                    new FeedOptions { MaxItemCount = 10, RequestContinuation = continuationToken } );
                continuationToken = feed.ResponseContinuation;
                foreach( Document document in feed )
                {
                    Console.WriteLine( document );
                }
            } 

我在 Cosmos db 中获取过滤文档的查询是 select * FROM c WHERE IS_DEFINED(c.Project)。如何在上面的代码中做到这一点?

在 Gaurav 回答后更新问题:

static async Task Main()
        {
            string continuationToken = null;
            DocumentClient client = new DocumentClient( new Uri( endpointUrl ), authorizationKey );
            var feed = client.CreateDocumentQuery(
                       UriFactory.CreateDocumentCollectionUri( SourceDatabase, SourceCollection ).ToString(),
                       new SqlQuerySpec( "select * FROM c WHERE IS_DEFINED(c.Project)" ),

                       new FeedOptions { MaxItemCount = 100, EnableCrossPartitionQuery=true } ) ;
            continuationToken = feed.
                
                foreach( Document document in feed )
                {
                   
                   Console.WriteLine( document.Id );
                }

【问题讨论】:

    标签: c# azure-cosmosdb


    【解决方案1】:

    我相信您使用的是 Cosmos DB SDK 2.0 版。如果是这种情况,那么您可以使用CreateDocumentQuery(String, String, FeedOptions) 方法来执行查询。

    下面是一个例子:

    // SQL querying allows dynamic property access
    dynamic document = client.CreateDocumentQuery<dynamic>(collectionLink,
        "SELECT * FROM books b WHERE b.title == 'War and Peace'").AsEnumerable().FirstOrDefault();
    

    强烈建议您开始使用SDK version 3.0,因为所有新功能都/将在新 SDK 中提供。

    更新

    请看下面的代码。它一次从集合中获取 100 个文档。

    using System;
    using Microsoft.Azure.Documents;
    using Microsoft.Azure.Documents.Client;
    using Microsoft.Azure.Documents.Linq;
    
    namespace SO68439632
    {
        class Program
        {
            static void Main(string[] args)
            {
                var endpointUrl = "https://accountname.documents.azure.com:443/";
                var authorizationKey = "authorizationkey==";
                DocumentClient client = new DocumentClient(new Uri(endpointUrl), authorizationKey);
                var databaseId = "database-name";
                var containerId = "container-name";
    
                string continuationToken = null;
                string collectionUrl = UriFactory.CreateDocumentCollectionUri(databaseId, containerId).ToString();
                do
                {
                    var feed = client.CreateDocumentQuery(
                               collectionUrl,
                               new SqlQuerySpec("select * FROM c WHERE c.Level = 2"),
                               new FeedOptions { MaxItemCount = 100, EnableCrossPartitionQuery = true, RequestContinuation = continuationToken }).AsDocumentQuery();
                    var result = feed.ExecuteNextAsync().Result;
                    continuationToken = result.ResponseContinuation;
                    var itemsCount = result.Count;
                    Console.WriteLine(string.Format("Total items fetched: {0}; More results available: {1}", itemsCount, !string.IsNullOrWhiteSpace(continuationToken)));
                }
                while (continuationToken != null);
            }
        }
    }
    

    【讨论】:

    • 你为什么要使用 FirstOrDefault()。我期待多个文档与我的过滤条件
    • 我刚刚从我在答案中分享的链接中复制了代码:)。
    • 这里的一个问题是 createDocumentQuery 中没有延续令牌参数。这样就迫使我一次阅读所有文档,而不是一次阅读 MAXItemCount
    • 您应该可以在FeedOptions 中指定延续令牌。
    • 请查看this
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多