簡體   English   中英

從 c# 中的 cosmos db 獲取給定查詢字符串的數據

[英]get data from cosmos db in c# for given querystring

我有以下 function 正在獲取整個文檔:

public async Task<IEnumerable<dynamic>> GetAllPreferences(string queryString)
        {
            IDocumentQuery<dynamic> query = documentClient.CreateDocumentQuery<dynamic>(
                UriFactory.CreateDocumentCollectionUri(collectionInfo.DatabaseName, collectionInfo.CollectionName))
                .AsDocumentQuery();

            List<dynamic> results = new List<dynamic>();
            while (query.HasMoreResults)
            {
                results.AddRange(await query.ExecuteNextAsync<dynamic>());
            }

            return results;
        }

但是在這里我無法使用queryString。 我的文檔結構如下:

{
    "type": [
        "university",
        "institute"
    ],
    "preferences": [
        {
            "type": "university",
            "universityDetail": [
                .....
            ],
            "state" : [
                ....
            ]
        },
        {
            "type": "institute",
            "instituteDetail": [
                .....
            ],
            "state" : [
                ....
            ]
        }
    ]
}

我只需要從每個文檔中獲取首選項。 等效的 sql 查詢是“從collectionInfo.CollectionName中選擇首選項”。

請建議代碼編輯,並幫助我處理我的情況所需的確切查詢字符串。

非常感謝提前。

您可以使用 SDK 嘗試此代碼:

public async Task<IEnumerable<dynamic>> GetAllPreferences(string queryString)
        {
            SqlQuerySpec queryStr = new SqlQuerySpec(queryString); //"select c.preferences from c"
            FeedOptions feedOptions = new FeedOptions();
            feedOptions.EnableCrossPartitionQuery = true;

            IDocumentQuery<dynamic> query = documentClient.CreateDocumentQuery(UriFactory.CreateDocumentCollectionUri(collectionInfo.DatabaseName, collectionInfo.CollectionName), queryString, feedOptions).AsDocumentQuery();

            List<dynamic> results = new List<dynamic>();
            while (query.HasMoreResults)
            {
                results.AddRange(await query.ExecuteNextAsync<dynamic>());
            }

            return results;
        }

請嘗試以下代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Cosmos.Linq;

namespace SO67598286
{
    class Program
    {
        const string connectionString = "connection-string";
        const string databaseId = "database-name";
        const string containerId = "container-name";
        static async Task Main(string[] args)
        {
            CosmosClient client = new CosmosClient(connectionString);
            Container container = client.GetContainer(databaseId, containerId);
            var query = container.GetItemLinqQueryable<IDictionary<string, object>>()
                .Select(f => f["preferences"]);
            var iterator = query.ToFeedIterator();
            while (iterator.HasMoreResults)
            {
                foreach (var document in await iterator.ReadNextAsync())
                {
                    Console.WriteLine(document.ToString());
                }
            }
        }
    }
}

Please note that this code makes use of Microsoft.Azure.Cosmos Nuget package and I believe you're using an older version of Cosmos DB SDK.

此外,請參閱此帖子了解更多詳細信息: https://blog.jeremylikness.com/blog/using-linq-to-query-dynamic-schemaless-cosmosdb-documents/ 我只使用了這篇博文中提到的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM