我正在尝试将NoSql数据存储集成到诸如Cosmos DB之类的Identity Server 4中.我想知道是否有人做过类似的事情和/或是否有可能.
我有一个超出SQL Azure的应用程序 - 无论如何我都愿意付出代价 - 而且我对调查Azure DocumentDB感兴趣.预览显然具有明显的可扩展性限制(如描述这里,例如),但我想我大概可以摆脱那些预览期间,只要我在正确的使用它.
所以这就是我的问题.如何设计我的应用程序以利用Azure DocumentDB的内置可伸缩性?举例来说,我知道,与Azure Table中存储-这便宜,但可怕的非常有限的选择-你需要结构两步层次中的所有数据:PartitionKey和RowKey.如果你这样做(在现实世界的应用程序中几乎不可能),ATS(据我所知)在幕后移动分区,从机器到机器,这样你就可以获得接近无限的可扩展性.太棒了,你永远不必考虑它.
使用SQL Server进行扩展显然要复杂得多 - 您需要设计自己的分片系统,处理找出所讨论的分片所在的服务器,等等.可能,并且做得非常可扩展,但复杂而痛苦.
那么可扩展性如何与DocumentDB一起使用?它承诺任意可扩展性,但存储引擎如何在幕后工作?我看到它有"数据库",每个数据库都可以有一些"集合",依此类推.但是它的任意可伸缩性如何映射到这些其他概念?如果我有一个包含数亿行的SQL表,如果我将所有这些数据放入一个集合中,我是否会获得所需的可扩展性?或者我是否需要手动将其分布在多个集合中,以某种方式进行分片?或者跨多个DB?或者DocumentDB是否足够聪明,能够以多种方式从多台计算机中合并查询,而不必考虑任何问题?要么...?
我一直在环顾四周,还没有找到任何关于如何处理此问题的指导.对其他人找到的或MS建议的内容非常感兴趣.
我正在学习DocumentDb中的数据建模.这是我需要一些建议的地方
请看下面我的文档是什么样的.
我可以采取两种方法,既有利也有弊.
场景1:
如果我通过将项目团队成员信息(即姓名,电子邮件等)保存在与项目相同的文档中来保持数据非规范化(请参阅下面的文档),我可以在一个查询中获取我需要的信息但是当Jane Doe结婚,她的姓氏改变了,我必须更新Projects系列中的很多文件.我还必须非常小心地确保包含员工信息的文档的所有集合也得到更新.例如,如果我在Projects集合中更新Jane Doe的名字但忘记更新TimeSheets集合,那我就麻烦了!
场景2:
如果我保持数据有些规范化并且只在项目文档中保留EmployeeId,那么每当我想获得项目列表时,我就可以运行三个查询:
然后我可以组合我的应用程序中的所有数据.
这里的问题是DocumentDb现在似乎有很多限制.我可能正在阅读项目团队中数百名员工的数百个项目.看起来没有有效的方法来获取其Id出现在我的第二个查询中的所有员工信息.请再次注意,我可能需要在此处提取数百个员工信息.如果以下SQL查询是我用于员工数据的,我可能需要运行几次相同的查询以获取我需要的所有信息,因为我认为我不能拥有数百个OR语句:
SELECT e.Id, e.firstName, e.lastName, e.emailAddress
FROM Employees e
WHERE e.Id = 1111 OR e.Id = 2222
Run Code Online (Sandbox Code Playgroud)
我知道DocumentDb仍在预览中,其中一些限制将得到修复.话虽如此,我该如何处理这个问题?如何有效地存储/管理和检索我需要的所有项目数据 - 包括项目团队信息?方案1是更好的解决方案还是方案2还是有更好的第三种选择?
这是我的文档的样子.一,项目文件:
{
id: 789,
projectName: "My first project",
startDate: "9/6/2014",
projectTeam: [
{ id: 1111, firstName: "John", lastName: "Smith", position: "Sr. Engineer" },
{ id: 2222, firstName: "Jane", lastName: "Doe", position: "Project Manager" }
]
}
Run Code Online (Sandbox Code Playgroud)
这里有两个员工文档,它们位于Employees集合中:
{
id: 1111,
firstName: "John",
lastName: "Smith",
dateOfBirth: "1/1/1967',
emailAddresses: …Run Code Online (Sandbox Code Playgroud) 我有一个简单(字符串)数组属性的文档.
{
"id": "one",
"tags": ["A", "B"]
}
{
"id": "two",
"tags": ["A", "C"]
}
Run Code Online (Sandbox Code Playgroud)
要检查,如果某个值是数组的一部分,我可以使用ARRAY_CONTAINS
SELECT * FROM c WHERE ARRAY_CONTAINS(c.tags, "B")
Run Code Online (Sandbox Code Playgroud)
将返回文件"一".
如何查询包含数组中可能值列表的文档?
返回标签数组中至少有一个值为IN("B","C")的所有文档.
- >文件"一"和"两"
我有文件列表(对象)该对象有多个文件,即Json记录存在,但我尝试上传文件串(记录)它不上传文档数据库,但我上传单文档记录,它成功上传.
List<MyModelClass> listObj = new List<MyModelClass>();
Document doc = await DocumentClient.CreateDocumentAsync("dbs/" + DocumentDatabase.Id + "/colls/" + DocumentCollection.Id, listObj);
Run Code Online (Sandbox Code Playgroud)
上面的代码不工作.....
foreach (var item in listObj )
{
Document doc = await Client.CreateDocumentAsync("dbs/" + DocumentDatabase.Id + "/colls/" + DocumentCollection.Id, item);
}
Run Code Online (Sandbox Code Playgroud)
这段代码对我有用.....
Syntax : CreateDocumentAsync(String,?Object,?RequestOptions,?Boolean)
Object :- Document object // I Know it as per syntax it need to be "Document Type".
Run Code Online (Sandbox Code Playgroud)
我想要任何其他方式一次上传所有文档....
我写了我的最新更新,然后从Stack Overflow得到以下错误:"Body限制为30000个字符;您输入38676".
可以说我在记录我的冒险经历时非常冗长,所以我在这里重写了我所拥有的更简洁的内容.
我已将我的(长)原始帖子和更新存储在pastebin中.我不认为很多人会阅读它们,但我付出了很多努力,所以不要让它们丢失是件好事.
我有一个包含100,000个文档的集合,用于学习如何使用CosmosDB以及性能测试等.
这些文档中的每一个Location都具有GeoJSON属性Point.
根据文档,应该自动索引GeoJSON点.
Azure Cosmos DB支持Points,Polygons和LineStrings的自动索引
我已经检查了我的集合的索引策略,它有自动点索引的条目:
{
"automatic":true,
"indexingMode":"Consistent",
"includedPaths":[
{
"path":"/*",
"indexes":[
...
{
"kind":"Spatial",
"dataType":"Point"
},
...
]
}
],
"excludedPaths":[ ]
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找一种方法来列出或以其他方式询问已经创建的索引,但我还没有找到这样的东西,所以我无法确认这个属性肯定是被索引的.
我创建了一个GeoJSON Polygon,然后使用它来查询我的文档.
这是我的查询:
var query = client
.CreateDocumentQuery<TestDocument>(documentCollectionUri)
.Where(document => document.Type == this.documentType && document.Location.Intersects(target.Area));
Run Code Online (Sandbox Code Playgroud)
然后我将该查询对象传递给以下方法,以便在跟踪使用的请求单位时获得结果:
protected async Task<IEnumerable<T>> QueryTrackingUsedRUsAsync(IQueryable<T> query)
{
var documentQuery = query.AsDocumentQuery();
var documents = new List<T>();
while (documentQuery.HasMoreResults)
{
var response = await documentQuery.ExecuteNextAsync<T>();
this.AddUsedRUs(response.RequestCharge); …Run Code Online (Sandbox Code Playgroud) 我是Cosmos DB的新手,我注意到我们可以根据需要设置分区键,以便通过以下代码有效扩展:
DocumentCollection myCollection = new DocumentCollection();
myCollection.Id = "coll";
myCollection.PartitionKey.Paths.Add("/deviceId");
Run Code Online (Sandbox Code Playgroud)
问题是我们可以在创建集合之后更改分区键并指定分区键吗?我可能会发现分区键的选择以后不合适.
我正在使用Change Feed Processor库(或Azure Functions Cosmos DB触发器)订阅集合更新.如何将多个独立(非竞争)消费者设置为同一集合的Feed?
一种方法是使用多个租赁集合,例如leases1,leases2等等.但这有点浪费.
有没有办法只用一个租赁集合来做到这一点?(例如,通过在某处指定使用者组名称,类似于Event Hubs Processor)
我正在寻找Cosmos DB的任何ORM.样本中提到的大多数客户端在需要时创建与表的新连接,即没有连接池策略.似乎总是如样本中给出的那样创建新连接是不可扩展的.如果我错了,请纠正我.有没有人有任何良好的ORM解决方案,其中包含连接池
azure-cosmosdb ×10
azure ×6
.net ×1
arrays ×1
asp.net-core ×1
c# ×1
gremlin ×1
javascript ×1
node.js ×1
sql ×1