How to search on Cosmos DB in a complex JSON Object(如何在复杂的JSON对象中搜索Cosmos DB)
问题描述
我有以下JSON对象,您可以看到它引用了一个Tag对象,该对象是一个标记数组。
public class GlobalPageTemplate : ISharedCosmosEntity
{
[JsonProperty("Id")]
public string Id { get; set; }
[CosmosPartitionKey]
public string CosmosEntityName { get; set; }
public string Description { get; set; }
public string ExtractedPageName { get; set; }
public string ExtractedSitecollectionTemplateName { get; set; }
public string ExtractedGlobalDesignTenantId { get; set; }
public string ExtractedGlobalDesigntenantSiteCollectionUrl { get; set; }
public string PageTemplatePictureUrl { get; set; }
public string Base64Image { get; set; }
public string PageTemplateName { get; set; }
public List<Section> Sections { get; set; }
public string TemplateAccessLevel { get; set; }
public List<Tag> Tags { get; set; }
}
public class Tag : ISharedCosmosEntity
{
[JsonProperty("Id")]
public string Id { get; set; }
public string TagName { get; set; }
[CosmosPartitionKey]
public string CosmosEntityName { get; set; }
}
在数据库中,对象保存方式如下:
{
"CosmosEntityName": "globalpagetemplates",
"Description": "depper",
"ExtractedPageName": "Home.aspx",
"ExtractedSitecollectionTemplateName": "CommunicationSite",
"ExtractedGlobalDesignTenantId": "696da7e7-a03e-4996-bbf8-625b8e4c4c06",
"ExtractedGlobalDesigntenantSiteCollectionUrl": "https://xx.sharepoint.com/sites/TST1",
"PageTemplatePictureUrl": "https://xx.blob.core.windows.net/globalpagetemplatespictures/0befc979-3958-4e27-a345-f4ce491eb1ee.png",
"Base64Image": "",
"PageTemplateName": "Plantilla 5 TST 1",
"Sections": [],
"TemplateAccessLevel": "Platinum",
"Tags": [
{
"Id": null,
"TagName": "recursos humanos",
"CosmosEntityName": null
}
],
"id": "0befc979-3958-4e27-a345-f4ce491eb1ee",
"_rid": "q6JzALvx8ZHMCQAAAAAAAA==",
"_self": "dbs/q6JzAA==/colls/q6JzALvx8ZE=/docs/q6JzALvx8ZHMCQAAAAAAAA==/",
"_etag": ""35001a26-0000-0300-0000-5df77cf60000"",
"_attachments": "attachments/",
"_ts": 1576500470
}
我有一个返回所有页面模板的方法:
/// <returns></returns>
[HttpGet]
public async Task<IHttpActionResult> GetGlobalPageTemplates()
{
var telemetry = new TelemetryClient();
try
{
var globalPageTemplateStore = CosmosStoreHolder.Instance.CosmosStoreGlobalPageTemplate;
var globalPageTemplates = await globalPageTemplateStore.Query().ToListAsync();
return Ok(globalPageTemplates);
}
catch (Exception ex)
{
string guid = Guid.NewGuid().ToString();
var dt = new Dictionary<string, string>
{
{ "Error Lulo: ", guid }
};
telemetry.TrackException(ex, dt);
return BadRequest("Error Lulo: " + guid);
}
}
不过在前端我可以在标签上过滤,
所以我需要创建一个接收字符串列表的方法,然后进行查询以获得与标签匹配的页面模板,过滤应该是独占的,我的意思是OR。
/// <returns></returns>
[HttpGet]
public async Task<IHttpActionResult> GetGlobalPageTemplatesByTags(List<string> tags)
{
var telemetry = new TelemetryClient();
try
{
var globalPageTemplateStore = CosmosStoreHolder.Instance.CosmosStoreGlobalPageTemplate;
var globalPageTemplates = await globalPageTemplateStore.Query().Where???
}
catch (Exception ex)
{
string guid = Guid.NewGuid().ToString();
var dt = new Dictionary<string, string>
{
{ "Error Lulo: ", guid }
};
telemetry.TrackException(ex, dt);
return BadRequest("Error Lulo: " + guid);
}
}
您知道如何实现这一点吗?
推荐答案
您可以使用LINQ:
中的Where()
、Any()
和Contains()
尝试此查询
var globalPageTemplates = await globalPageTemplateStore
.Query()
.Where(template => template
.Tags
.Any(tag => tags.Contains(tag.TagName))
)
.ToListAsync();
如果您希望对tags
进行更快的O(1)查找,我建议您提前将其转换为HashSet<string>
:
var tagLookups = new HashSet<string>(tags);
var globalPageTemplates = await globalPageTemplateStore
.Query()
.Where(template => template
.Tags
.Any(tag => tagLookups.Contains(tag.TagName))
)
.ToListAsync();
基本思路是对每个模板先用Where()
过滤,然后用Contains()
检查tags
中是否存在Any()
模板标签。
注意:必须在查询末尾添加ToListAsync()
,才能将IQueryable<GlobalPageTemplate>
转换为List<GlobalPageTemplate>
。这是因为查询是异步的。
这篇关于如何在复杂的JSON对象中搜索Cosmos DB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何在复杂的JSON对象中搜索Cosmos DB
基础教程推荐
- SSE 浮点算术是否可重现? 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- rabbitmq 的 REST API 2022-01-01
- c# Math.Sqrt 实现 2022-01-01
- 将 XML 转换为通用列表 2022-01-01
- MS Visual Studio .NET 的替代品 2022-01-01