查询cosmos db document过滤文档

Query cosmos db document to filter documents

我正在读取我的 cosmos db sql api 集合中的所有文档,我想过滤掉那些在 [=23= 中定义了特定 属性 的文档].所以如果文件是这个模式

{
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 );
                }

我相信您使用的是 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,因为所有新功能 are/will 都可以在新 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);
        }
    }
}