未在Cosmos DB中与收集一起创建索引策略

时间:2019-05-27 07:55:35

标签: indexing azure-cosmosdb

我正在使用Java SDK编写数据库创建脚本,并且未按预期(和documented)创建索引策略。

  • 使用的JAVA SDK:com.microsoft.azure:azure-documentdb:2.4.0
  • 用于Windows的Azure Cosmos DB仿真器2.2.2
  • 当前使用SQL帐户在Azure Portal中安装Cosmos DB

我使用JAVA库构造了集合创建请求,结果(在实际请求之前)如下所示(DocumentCollection::toJson()):

{
    "uniqueKeyPolicy": {},
    "partitionKey":
    {
        "kind": "Hash",
        "paths": ["/playerId"]
    },
    "indexingPolicy":
    {
        "indexingMode": "Consistent",
        "automatic": true,
        "includedPaths": [
            {
                "path": "/gameId/?",
                "indexes": [
                    {
                        "kind": "Range",
                        "dataType": "String"
                    }
                ]
            },
            {
                "path": "/playerId/?",
                "indexes": [
                    {
                        "kind": "Range",
                        "dataType": "String"
                    }
                ]
            },
            {
                "path": "/date/*",
                "indexes": [
                    {
                        "kind": "Range",
                        "dataType": "String"
                    }
                ]
            }
        ],
        "excludedPaths": [
            {
                "path": "/*"
            }
        ]
    },
    "id": "Games"
}

请求成功完成,但是如果我使用数据浏览器或DocumentClient.readCollection检查实际的索引编制策略,则它看起来像这样:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/gameId/?",
            "indexes": []
        },
        {
            "path": "/playerId/?",
            "indexes": []
        },
        {
            "path": "/date/*",
            "indexes": []
        }
    ],
    "excludedPaths": [
        {
            "path": "/*"
        },
        {
            "path": "/\"_etag\"/?"
        }
    ]
}

如您所见,索引定义的数组为空。 然后,如果我从SDK生成的输出中复制索引策略,然后手动将其粘贴到Emulator或Portal的“ Scale and settings”窗口中以创建集合,则更新结果如下:

{
    "indexingMode": "consistent",
    "automatic": true,
    "includedPaths": [
        {
            "path": "/gameId/?",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                }
            ]
        },
        {
            "path": "/playerId/?",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                }
            ]
        },
        {
            "path": "/date/*",
            "indexes": [
                {
                    "kind": "Range",
                    "dataType": "String",
                    "precision": -1
                },
                {
                    "kind": "Range",
                    "dataType": "Number",
                    "precision": -1
                }
            ]
        }
    ],
    "excludedPaths": [
        {
            "path": "/*"
        },
        {
            "path": "/\"_etag\"/?"
        }
    ]
}

因此正在创建索引(尽管有额外的Number条目,如here所述)。 我在创建脚本时做错了什么?

1 个答案:

答案 0 :(得分:0)

请遵循github source code,并参考以下对我有用的代码。

import com.microsoft.azure.documentdb.*;

import java.util.Collection;
import java.util.List;

public class CreateCollectionTest {
    //
    static private String YOUR_COSMOS_DB_ENDPOINT = "https://***.documents.azure.com:443/";
    static private String YOUR_COSMOS_DB_MASTER_KEY = "***";

    public static void main(String[] args) throws DocumentClientException {

        DocumentClient client = new DocumentClient(
                YOUR_COSMOS_DB_ENDPOINT,
                YOUR_COSMOS_DB_MASTER_KEY,
                new ConnectionPolicy(),
                ConsistencyLevel.Session);

        DocumentCollection collection = new DocumentCollection();
        collection.set("id", "game");


        IndexingPolicy indexingPolicy = new IndexingPolicy();
        Collection<IncludedPath> includedPaths = new ArrayList<IncludedPath>();
        IncludedPath includedPath = new IncludedPath();
        includedPath.setPath("/gameId/?");
        Collection<Index> indexes = new ArrayList<Index>();

        Index stringIndex = Index.Range(DataType.String);
        stringIndex.set("precision", -1);
        indexes.add(stringIndex);

        Index numberIndex = Index.Range(DataType.Number);
        numberIndex.set("precision", -1);
        indexes.add(numberIndex);

        includedPath.setIndexes(indexes);
        includedPaths.add(includedPath);
        indexingPolicy.setIncludedPaths(includedPaths);

        collection.setIndexingPolicy(indexingPolicy);

        ResourceResponse<DocumentCollection> createColl = client.createCollection("dbs/db", collection, null);


    }
}