DocumentDb:没有索引的查询

时间:2015-09-23 07:40:47

标签: azure azure-cosmosdb

当从索引中排除所有路径时,为什么我仍然能够对ID以外的字段执行成功的查询?

排除所有路径:

SELECT * FROM c where c.Key = "117dfd49-a71d-413b-a9b1-841e88db06e8"

查询:

{
  "indexingMode": "consistent",
  "automatic": true,
  "includedPaths": [
    {
      "path": "/*",
      "indexes": [
        {
          "kind": "Range",
          "dataType": "Number",
          "precision": -1
        },
        {
          "kind": "Hash",
          "dataType": "String",
          "precision": 3
        }
      ]
    },
    {
      "path": "/\"_ts\"/?",
      "indexes": [
        {
          "kind": "Range",
          "dataType": "Number",
          "precision": -1
        },
        {
          "kind": "Hash",
          "dataType": "String",
          "precision": 3
        }
      ]
    }
  ],
  "excludedPaths": []
}

据此this MSDN article

  

关闭索引时,只能通过自我链接或使用ID查询来访问文档。

修改

在查看索引编制策略时,我会看到我的路径未被排除:

var collectionSpec = new DocumentCollection { Id = collectionId };
var requestOptions = new RequestOptions { OfferType = "S1" };

collection = Client.CreateDocumentCollectionAsync(databaseLink, collectionSpec, requestOptions).Result;

collection.IndexingPolicy.IndexingMode = IndexingMode.Consistent;
collection.IndexingPolicy.ExcludedPaths.Add(new ExcludedPath()
    {
        Path = "/*"
    });

我做错了什么?

我正在使用一致的索引,所以如果我理解正确的话,这肯定不是最终与索引传播一致的问题吗?

以下是所有代码:

suminsured_amount

2 个答案:

答案 0 :(得分:2)

在设置新的索引编制策略后,我没有看到任何替换文档集的调用。

您需要致电Client.ReplaceDocumentCollectionAsync()以使索引政策更改生效。

方法文档为here

这是由DocumentDB团队编写的关于在线更新索引政策的an article(指的是需要调用ReplaceDocumentCollectionAsync())。

答案 1 :(得分:1)

您需要更改代码段,以便在之前client.CreateDocumentCollectionAsync()的集合规范上定义索引策略,以便它包含在为DocumentDB创建集合的网络请求中

在收藏品创建时设置自定义索引政策

var collection = new DocumentCollection { Id = "myCollection" };

collection.IndexingPolicy.IndexingMode = IndexingMode.Consistent;

collection.IndexingPolicy.IncludedPaths.Add(
    new IncludedPath { 
        Path = "/*", 
        Indexes = new Collection<Index> { 
            new RangeIndex(DataType.String) { Precision = -1 }, 
            new RangeIndex(DataType.Number) { Precision = -1 }
        }
    });

await client.CreateDocumentCollectionAsync(database.SelfLink, collection);

更新现有馆藏的索引政策

作为David mentioned - 您还可以使用Client.ReplaceDocumentCollectionAsync()更新现有集合的索引政策。