使用 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 移动应用程序为移动系统开发后端。
我正在使用此处给出的示例:
到目前为止一切顺利 - 然而,每当我 运行 这个 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);
});
我目前正在使用带有 Node.js 和 Azure Cosmos DB(文档数据库)的 Azure 移动应用程序为移动系统开发后端。
我正在使用此处给出的示例:
到目前为止一切顺利 - 然而,每当我 运行 这个 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);
});