Azure cosmosdb COSMOSDBSQLAPI查询

Azure cosmosdb COSMOSDBSQLAPI查询,azure-cosmosdb,Azure Cosmosdb,我的文档如下所示: { "id": "abc-123", "firstName": "John", "lastName": "Doe", "emails": [ { "id": "email-121", "email": "j.doe@example.com", "isPrimary": true }, { "id": "email-281", "emai

我的文档如下所示:

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


我非常感谢您的帮助。

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

在查询sql中,
c
join nothing是nothing(
c.emails
array未定义),
c
join empty
c.email
array是
[]
)。因此,您需要根据您的情况执行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.');
}
函数示例(){
var collection=getContext().getCollection();
var returnJson=[];
var-map={};
var isAccepted=collection.queryDocuments(
collection.getSelfLink(),
'从未定义的c中选择c.id、c.firstName、c.lastName(c.emails)',
功能(错误、馈送、选项){
如果(错误)抛出错误;
如果(!feed | |!feed.length){
var response=getContext().getResponse();
响应。setBody(“未找到文件”);
}
否则{
returnJson=饲料;
}
});
var a=collection.queryDocuments(
collection.getSelfLink(),
'选择c.id、c.firstName、c.lastName、e.email FROM c在e.isPrimary=true的c.email中加入e',
功能(错误、馈送、选项){
如果(错误)抛出错误;
如果(!feed | |!feed.length){
var response=getContext().getResponse();
响应。setBody(“未找到文件”);
}
否则{

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