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 emptyc.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时,我看不到有什么大的差异读取整个文档与读取子集之间的差异。我想无论我在数据中保存什么,我都在用更复杂的查询来弥补差异。