Cosmos DB SQL API查询

时间:2018-07-09 15:48:15

标签: azure-cosmosdb

我的文档如下:

{
  "id": "abc-123",
  "firstName": "John",
  "lastName": "Doe",
  "emails": [
      {
         "id": "email-121",
         "email": "j.doe@example.com",
         "isPrimary": true
      },
      {
         "id": "email-281",
         "email": "testing@example.com",
         "isPrimary": false
      }
  ]
}

要记住的重要一点是,联系人记录可能没有电子邮件,一封电子邮件或多封电子邮件。

我有以下SQL查询来检索联系信息。如果在emails属性下至少有一封电子邮件,则效果很好,但如果没有电子邮件,则不返回任何内容。

我觉得这是一个非常简单的更改,但到目前为止我仍无法弄清,我希望获得一些帮助。

SELECT c.id, c.firstName, c.lastName, e.email
FROM c JOIN e IN c.emails
WHERE c.id = "abc-123" AND e.isPrimary = true

我尝试了以下操作,但这给了我一个错误:

SELECT c.id, c.firstName, c.lastName, e.email
FROM c JOIN e IN c.emails
WHERE c.id = "abc-123" AND (e.isPrimary = true OR e.id = NULL)

我想要的是我应该始终获取联系人的ID,名字和姓氏。如果有“主要”电子邮件,我也应该收到,但如果联系人没有电子邮件,我仍然应该得到联系人的ID,名字和姓氏。

如果联系人在emails属性中没有任何电子邮件,那么我当前的SQL查询将什么也不返回。因此,显然,我需要修改查询以解决联系人根本没有电子邮件的情况。

我希望能对此有所帮助。

1 个答案:

答案 0 :(得分:0)

正如您和@David Makogon在评论中所说,天蓝色的波斯菊数据库不支持LEFT JOIN

在查询sql中,c联接为空(c.emails数组未定义),c联接为空的c.email数组为空(c.emails数组是[])。因此,您需要根据情况执行2条sql。我建议您使用存储过程根据需要合并结果。

存储过程代码:

function sample() {
    var collection = getContext().getCollection();
    var returnJson = [];
    var map ={};

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT c.id, c.firstName, c.lastName from c where not is_defined(c.emails) ',
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            returnJson = feed;
        }
    });

    var a = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT c.id, c.firstName, c.lastName, e.email FROM c JOIN e IN c.emails WHERE  e.isPrimary = true',
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            for(var i=0 ; i <feed.length;i++){
               returnJson.push(feed[i])
            }
            var response = getContext().getResponse();          
            response.setBody(returnJson);
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

希望它对您有帮助。