【问题标题】:Cosmos DB SQL API QueryCosmos DB SQL API 查询
【发布时间】:2018-12-17 08:50:23
【问题描述】:

我的文档如下所示:

{
  "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 查询将不返回任何内容。因此,显然我需要修改我的查询以解决联系人根本没有电子邮件的情况。

我将不胜感激。

【问题讨论】:

  • 从未听说过 Cosmos DB 中的 LEFT JOIN。对于 SQL 数据库,这不是 T-SQL。你确定 Cosmos DB SQL API 支持LEFT JOIN
  • 我很困惑:当没有任何电子邮件时,您希望获得什么结果?另外,我看到你发表了评论,但我不确定上下文,因为听起来你在问一个澄清问题(问某人“你确定”某事),但你也发布了原始问题。请编辑您的问题,使其更具体(并澄清您在评论中提出的问题)。
  • @DavidMakogon 更新了原始问题。我不是要求澄清。我正在尝试通过 Cosmos DB SQL API 获取联系人信息。目标是即使联系人没有电子邮件也能获取联系信息。如果有主电子邮件,我也应该得到它。对于我当前的 SQL 查询,如果联系人在 emails 属性中根本没有电子邮件,则查询不会返回任何内容,甚至不会返回联系人的 ID、名字和姓氏。希望这能澄清我的问题。
  • @DavidMakogon 根据我的 cmets,有人建议我应该使用 LEFT JOIN,我只是在回复他。看起来他意识到这不是 T-SQL 并删除了他的 cmets。
  • 好的。我试图从我的文档/联系人对象中只获取我需要的数据。如果存在,我可以提取整个内容并获取主要电子邮件。我总是试图准确地获得我需要的东西,以尽量减少在此过程中消耗的 RU,但很多时候,这比任何有形的好处都更令人头疼。当我比较 RU 时,我看不出阅读整个文档与阅读子集之间有很大区别。我想无论我在数据中保存什么,我都会在更复杂的查询中弥补差异。

标签: azure-cosmosdb


【解决方案1】:

正如您和@David Makogon 在评论中所说,azure cosmos db 不支持LEFT JOIN

在查询sql中,cjoin nothing is nothing(c.emailsarray is not defined),cjoin empty c.emailarray is nothing(c.emailsarray is [])。因此,您需要根据您的情况执行 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.');
}

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2019-09-26
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    相关资源
    最近更新 更多