СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ в SQL API Azure CosmosDB - PullRequest
0 голосов
/ 19 сентября 2019

Я использовал JOIN в коллекции Azure Cosmos DB, используя SQL API для запроса документов.

У меня два контактных документа, один со свойством Address, а другой без адреса.

Iнеобходимо получить список адресов всех лиц (в том числе лиц, не имеющих адреса).Я использовал следующий запрос, чтобы сделать это.Но он дает список лиц, у которых есть адрес.

Есть ли способ выполнить ЛЕВОЕ СОЕДИНЕНИЕ?

Запрос:

ВЫБРАТЬbase.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Адрес IN base.Address

Образец документа:

[
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "Address": [
      {
        "City": "aaaa"
      },
      {
        "City": "bbbb"
      }
    ]
  },
  {
    "FirstName": "Jayanth",
    "LastName": "T"
  }
]

Ожидаемый результат:

[
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "aaa"
  },
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "bbbb"
  },
  {
    "FirstName": "Jayanth",
    "LastName": "T"
  }
]

Фактический результат:

[
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "bbbb"
  },
  {
    "FirstName": "Saravana",
    "LastName": "Kumar",
    "City": "bbbb"
  }
]

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Как я знаю, до сих пор космодром не поддерживает левое соединение, вы можете проголосовать за этот поток .

В качестве обходного пути, я предлагаю вам использовать 2 разных sql в хранимой процедуре., затем объедините в нем результаты.

1. SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)

2. SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address

SP:

function sample() {
    var collection = getContext().getCollection();

    var array = [];
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address',
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
                array.push(feed);
        }
    });

    var isAccepted1 = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)',
    function (err, feed1, options) {
        console.log(222)
        if (err) throw err;
        if (!feed1|| !feed1.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {

                array.push(feed1);

        }
    });
    var response = getContext().getResponse();
    response.setBody(array);

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

Вы можете настроитьформат вывода, как вы хотите.

0 голосов
/ 23 сентября 2019

тогда не присоединяйтесь.Вы можете напрямую получить доступ к полю адреса.например:

SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base

будет отображаться пустая или пустая строка, если у него нет свойства

...