使用 Azure Mobile Apps for Node 在 Cosmos DB 上执行 SQL 查询连接

Executing SQL query joins on Cosmos DB using Azure Mobile Apps for Node

我目前正在使用带有 Node.js 和 Azure Cosmos DB(文档数据库)的 Azure 移动应用程序为移动系统开发后端。

我正在使用此处给出的示例:

https://github.com/Azure/azure-mobile-apps-node/blob/master/samples/custom-api-sql-stmt/api/completeall.js

到目前为止一切顺利 - 然而,每当我 运行 这个 SQL,我得到:

TypeError: provider.read is not a function at Function.module.exports.api.execute (x:\x\node_modules\azure-mobile-apps\src\data\index.js:32:18

我需要 运行 的 SQL 看起来像这样:

SELECT c.id, c.Email FROM Profile c JOIN d in c.DeviceIDs WHERE d.DeviceID = @deviceId

这是因为我的数据是嵌套的,像这样(Cosmos 中的 Profile 集合)- 我需要获取 DeviceID 匹配的记录:

[ { "id": "2ca572d0-858d-4376-8537-c228a8379638", "Email": "test@user.com", "Name": "Test User 1", "OrgRoles": null, "DeviceIDs": [ { "DeviceID": "123445555555", "DeviceCode": "1234" } ], "UpdatedDate": "2017-11-10T13:18:32.0110724Z", "CreatedDate": "2017-11-10T13:18:27.220764Z", "IsDeleted": true }]

我希望能够以另一种方式做到这一点,使用类似这样的东西:

context.tables('Profile').where({ DeviceID: id })

但我不知道究竟如何使用这种方法完成连接,更不用说在同一个 table 上连接了。

任何人都可以帮助解决这两种方法吗?我感觉 Azure 移动应用程序文档数据库驱动程序尚未由 MS 正确完成,但我似乎无法联系任何人,看看我是否可以提供任何帮助。

更新:我们已经设法直接通过文档数据库驱动程序完成此操作,但这意味着我们将需要一些 api 方法以一种方式连接到数据库,而另一些方法则以另一种方式连接方法。似乎很遗憾,微软应该全力投资 Cosmos - 恕我直言,这非常好。

作为 Azure Mobile Apps Node.js SDK doesn't support Cosmos DB driver, you would need to integrate the SDK azure-documentdb-node 进入您的移动应用程序。

var documentClient = require("documentdb").DocumentClient;

var endpoint = 'https://<account_name>.documents.azure.com:443/';
var primaryKey = '<primary_key>';
var client = new documentClient(endpoint, { "masterKey": primaryKey });

var databaseUrl = `dbs/<database_name>`;    
var collectionUrl = `${databaseUrl}/colls/Profile`;

var querySpec = {
    'query': 'SELECT c.id, c.Email FROM Profile c JOIN d in c.DeviceIDs WHERE d.DeviceID = @deviceId',

    "parameters": [
        { "name": "@deviceId", "value": '123445555555' }
    ]
}

client.queryDocuments(collectionUrl, querySpec).toArray(function(err, results) {
    if(err) return console.log(err);

    console.log(results);
});