cosmos DB:使用查询中的表名选择表中的所有项目

时间:2018-09-19 13:19:53

标签: sql azure-cosmosdb

我试图弄清楚如何通过node.js在cosmosDB中编写查询,这将允许我在查询中命名表,以便可以选择该表中的所有项目。 以下设置有效,

cosmosClient.database('samples')
  .container('container_id')
  .items.query(querySpec).toArray()
  .then(results => console.log(results))
  .catch(error => console.log(error));

但是,如果使用container方法,但我必须使用表/集合的名称作为参数,但是我想实现的是使用这样的查询的方式:SELECT * FROM colleciton_id... 我看到cosmosDB有一个containers道具,它说允许您针对所有容器/集合进行查询,但是当我尝试时:

  cosmosClient.database('samples').containers.query(querySpec).toArray()
    .then(results => console.log(results))
    .catch(error => console.log(error));

我得到了一个集合名称数组,而不是指定集合中的所有项目。

是否有一种无需使用container(id)即可针对集合编写查询的方法?

1 个答案:

答案 0 :(得分:0)

通过容器,sdk表示收集。 SQL查询是在集合级别执行的,因此,如果您编写类似select * from xxx的内容,则xxx不必是集合的名称。 CosmosDB将知道您已经定位到哪个目标,而xxx将类似于别名。集合名称已在container()方法中定义。

cosmosClient.database('samples').containers方法将返回数据库中所有集合的枚举。

如果要进行交叉集合查询,您需要做的是遍历这些集合,并对每个集合进行此操作。

cosmosClient.database('samples')
  .container(containerId)
  .items.query(querySpec).toArray()
  .then(results => console.log(results))
  .catch(error => console.log(error));

其中containerId是迭代中的当前collectionid。

但是,我警告您,如果需要交叉收集查询,那么数据库设计可能有问题。