【问题标题】:Azure Function Javascript (NodeJS) CosmosDB queryAzure Function Javascript (NodeJS) CosmosDB 查询
【发布时间】:2018-12-14 18:31:17
【问题描述】:

非常直接的问题。我的 index.js 文件中有以下函数。

const databaseId = config.database.id;
const collectionId = config.collection.id;
const client = new CosmosClient({ endpoint: CosmosDBName, auth: { masterKey: CosmosDBKey } });
const query = `SELECT c.message.id FROM ${collectionId} c WHERE c.message.timestampFormatted > '${start}' AND c.message.timestampFormatted < '${end}'`;

queryCosmosDB(client, databaseId, collectionId, query)

async function queryCosmosDB(client, databaseId, collectionId, query, context) {
    const querySpec = {
        query: query,
        parameters: []
    };

    const { result: results } = await client.database(databaseId).container(collectionId).items.query(querySpec).toArray();

    for (var queryResult of results) {
        let resultString = JSON.stringify(queryResult);
        context.log(`\tQuery returned ${resultString}\n`);
    }
}

如果我执行这个函数,响应是以下错误(我省略了一些无用的信息)

ERROR: {"code":400,"body":"{\"code\":\"BadRequest\",\"message\":\"Cross partition query is required but disabled. Please set x-ms-documentdb-query-enablecrosspartition to true, specify x-ms-documentdb-partitionkey, or revise your query to avoid this exception. ...}

现在,我得到了 CosmosDB 使用的分区架构,但就我而言,最好的做法是什么?我应该以某种方式更改查询吗?如果可以,如何更改?如果我必须插入某种跨分区查询字符串,我应该怎么做?

我发现的唯一其他问题是this SO's question,但我不像他那样管理数据,因为我认为 SDK 与一年半前相比发生了很大变化。我目前使用this tutorial 作为基线。

非常感谢您的帮助!

【问题讨论】:

    标签: node.js azure azure-functions azure-cosmosdb


    【解决方案1】:

    您可以简单地使用 NodeJS sdk 启用跨分区查询,方法是将其作为query 函数级别的选项的一部分提供。

    async function queryCosmosDB(client, databaseId, collectionId, query, context) {
        const querySpec = {
            query: query,
            parameters: []
        };
    
        const options = {
            enableCrossPartitionQuery: true
          };
    
        const { result: results } = await client.database(databaseId).container(collectionId).items.query(querySpec, options).toArray();
    
        for (var queryResult of results) {
            let resultString = JSON.stringify(queryResult);
            context.log(`\tQuery returned ${resultString}\n`);
        }
    }
    

    【讨论】:

    • 非常感谢,在发布问题后,我搜索了 SDK 文档以找到此属性,并在您回答时准确地找到了它。无论如何,非常感谢非常有帮助!
    猜你喜欢
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    相关资源
    最近更新 更多