从 c# 中的 cosmos db 获取给定查询字符串的数据
get data from cosmos db in c# for given querystring
我有以下功能可以获取整个文档:
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 查询是“select 来自 collectionInfo.CollectionName 的偏好”。
请建议代码编辑,并帮助我确定我的情况所需的确切 queryString。
非常感谢。
请试试这个代码:
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());
}
}
}
}
}
请注意,此代码使用了 Microsoft.Azure.Cosmos
Nuget 包,我相信您使用的是旧版本的 Cosmos DB SDK。
此外,请参阅此 post 了解更多详情:https://blog.jeremylikness.com/blog/using-linq-to-query-dynamic-schemaless-cosmosdb-documents/。我只使用了此博客中提到的代码 post。
您可以使用您的 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;
}
我有以下功能可以获取整个文档:
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 查询是“select 来自 collectionInfo.CollectionName 的偏好”。
请建议代码编辑,并帮助我确定我的情况所需的确切 queryString。
非常感谢。
请试试这个代码:
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());
}
}
}
}
}
请注意,此代码使用了 Microsoft.Azure.Cosmos
Nuget 包,我相信您使用的是旧版本的 Cosmos DB SDK。
此外,请参阅此 post 了解更多详情:https://blog.jeremylikness.com/blog/using-linq-to-query-dynamic-schemaless-cosmosdb-documents/。我只使用了此博客中提到的代码 post。
您可以使用您的 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;
}