我的文档如下:
{
"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查询将什么也不返回。因此,显然,我需要修改查询以解决联系人根本没有电子邮件的情况。
我希望能对此有所帮助。
答案 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.');
}
希望它对您有帮助。