Cosmos DB를 사용할 JavaScript 코드 추가

완료됨

이 단원에서는 LIKE, JOIN 및 WHERE와 같은 SQL 키워드를 사용하여 Cosmos SDK로 데이터를 쿼리하는 방법을 알아봅니다.

컨테이너에 대한 쿼리 작업

쿼리 작업은 컨테이너에만 적용됩니다. 쿼리는 컨테이너 자체에서 실행되므로 products와 같은 컨테이너의 올바른 이름을 사용할 필요가 없습니다. SDK 참조 설명서 또는 포털에서 컨테이너를 나타내는 컨테이너 이름(예: root 또는 c)이 표시될 수 있습니다.

모든 문서 쿼리

Cosmos DB Core(SQL) 데이터베이스의 컨테이너에서 문서를 찾으려면 쿼리 사양과 함께 컨테이너 개체에 대해 SDK query 메서드를 사용합니다. 쿼리 사양에는 query 속성과 선택적인 parameters 속성이 필요합니다.

속성 용도
query(필수) SQL 쿼리 텍스트. 간단한 쿼리는 select * from products입니다.
parameters(선택 사항) 쿼리에 대한 변수 대체. 이름은 쿼리에 사용된 이름에 해당하며 값은 실제 대체 변수입니다. 최대 10개의 매개 변수를 제공할 수 있습니다.
const querySpecification = {
    query: `select * from products`,
    parameters: undefined
};

이 쿼리는 컨테이너의 모든 문서를 반환합니다.

컨테이너에서 LIKE를 사용하여 이름으로 문서 쿼리

검색을 구체화하고 유연성을 제공하려면 LIKE 키워드를 사용하여 문서의 이름 속성에 Blue 값이 포함된 일치하는 문서 속성을 찾습니다. 값이 백분율 기호 %로 래핑되므로 이름은 Blue로 시작하거나 Blue로 끝나거나 중간에 Blue가 있을 수 있습니다.

// SQL Query specification
const querySpec = {
    // SQL query text using LIKE keyword and parameter
    query: `select * from products p where p.name LIKE @propertyValue`,
    // Optional SQL parameters, to be used in query
    parameters: [
        {
            // name of property to find in query text
            name: "@propertyValue",
            // value to insert in place of property
            value: `%Blue%`,
        }
    ]
};

LIKE 키워드 사용

컨테이너에서 쿼리를 실행하여 문서를 가져옵니다. 쿼리의 결과를 fetchAll과 함께 가져와 구조 파괴된 속성 resources에 반환됩니다.

// Execute query
const { resources } = await container.items.query(querySpec).fetchAll();

전체 컬렉션을 반복하고 for/of 루프를 사용합니다.

let i = 0;

// Show results of query
for (const item of resources) {
    console.log(`${++i}: ${item.id}: ${item.name}, ${item.sku}`);
}

출력은 다음과 같습니다.

1: 08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2: Touring-1000 Blue, 50, BK-T79U-50      
2: 2C981511-AC73-4A65-9DA3-A0577E386394: Touring-1000 Blue, 46, BK-T79U-46      
3: 44873725-7B3B-4B28-804D-963D2D62E761: Touring-1000 Blue, 60, BK-T79U-60      
4: 4E4B38CB-0D82-43E5-89AF-20270CD28A04: Touring-2000 Blue, 60, BK-T44U-60      
5: 5308BAE7-B0CB-4883-9A93-192CB10DC94F: Touring-3000 Blue, 44, BK-T18U-44 

컨테이너에서 LIKE를 사용하여 문자열 속성으로 문서 쿼리

쿼리를 보다 유연하게 만들려면 문서의 속성과 찾을 값을 사용하는 함수로 래핑합니다.

// Find all products that match a property with a value like `value`
async function executeSqlFind(property, value) {
  // Build query
  const querySpec = {
    query: `select * from products p where p.${property} LIKE @propertyValue`,
    parameters: [
      {
        name: "@propertyValue",
        value: `${value}`,
      },
    ],
  };

  // Show query
  console.log(querySpec);

  // Get results
  const { resources } = await container.items.query(querySpec).fetchAll();

  let i = 0;

  // Show results of query
  for (const item of resources) {
    console.log(`${++i}: ${item.id}: ${item.name}, ${item.sku}`);
  }
}

속성 및 값은 함수에 전달되고 문자열 값에 대한 쿼리에서 사용됩니다.

컨테이너에서 JOIN 키워드를 사용하여 문서 쿼리 및 인벤토리 하위 속성 반환

문서 셰이프에는 태그 및 인벤토리의 두 가지 하위 속성이 포함됩니다. 이러한 하위 속성에 액세스하려면 JOIN 키워드를 사용합니다. 다음 SQL 쿼리는 가독성을 위해 형식이 지정되었으며 Cosmos DB SDK와 함께 사용할 필요가 없습니다.

SELECT
    p.id, 
    p.name, 
    i.location, 
    i.inventory
FROM 
    products p 
JOIN 
    inventory i IN p.inventory 
WHERE 
    p.name LIKE '%Blue%'
AND 
    i.location='Dallas'

인벤토리 변수 i에는 다음이 적용됩니다.

  • 하위 속성 데이터에 액세스하기 위해 JOIN 절에 명명됩니다.
  • 데이터 세트를 줄이기 위해 WHERE 절에 사용됩니다.
  • 인벤토리 속성을 반환하기 위해 SELECT 절에 사용됩니다.

특정 위치에서 특정 속성에 대한 모든 인벤토리를 찾으려면 다음 함수를 사용합니다. 매개 변수 대체를 사용하여 일치하는 위치를 찾을 때 사용할 하위 속성 값과 문서의 최상위 속성을 제공합니다.

async function executeSqlInventory(propertyName, propertyValue, locationPropertyName, locationPropertyValue) {
  // Build query
  const querySpec = {
    query: `select p.id, p.name, i.location, i.inventory from products p JOIN i IN p.inventory where p.${propertyName} LIKE @propertyValue AND i.${locationPropertyName}=@locationPropertyValue`,

    parameters: [
      {
        name: "@propertyValue",
        value: `${propertyValue}`,
      },
      { 
        name: "@locationPropertyValue", 
        value: `${locationPropertyValue}` },
    ],
  };

  // Show query
  console.log(querySpec);

  // Get results
  const { resources } = await container.items.query(querySpec).fetchAll();

  let i = 0;

  // Show results of query
  console.log(`Looking for ${propertyName}=${propertyValue}, ${locationPropertyName}=${locationPropertyValue}`);
  for (const item of resources) {
    console.log(
      `${++i}: ${item.id}: '${item.name}': current inventory = ${
        item.inventory
      }`
    );
  }
}

이 함수는 다음과 같은 출력을 반환합니다.

Looking for name=%Blue%, location=Dallas
1: 08225A9E-F2B3-4FA3-AB08-8C70ADD6C3C2: 'Touring-1000 Blue, 50': current inventory = 42
2: 2C981511-AC73-4A65-9DA3-A0577E386394: 'Touring-1000 Blue, 46': current inventory = 12
3: 44873725-7B3B-4B28-804D-963D2D62E761: 'Touring-1000 Blue, 60': current inventory = 83
4: 4E4B38CB-0D82-43E5-89AF-20270CD28A04: 'Touring-2000 Blue, 60': current inventory = 90
5: 5308BAE7-B0CB-4883-9A93-192CB10DC94F: 'Touring-3000 Blue, 44': current inventory = 97

데이터를 삽입하거나 업데이트하는 Upsert

upsert를 사용하면 데이터가 존재하지 않는 경우 데이터가 추가되고, 데이터가 있는 경우 업데이트되도록 할 수 있습니다. JavaScript SDK는 수행된 작업을 나타내는 statusCode를 반환합니다.

Upsert statusCode 의미
201 삽입
200 업데이트

다음 JavaScript는 단일 함수를 사용하고 container.items().upsert()를 사용합니다.

// Either insert or update item
async function upsert(item) {

  // Process request
  const result = await container.items.upsert(item);

  if(result.statusCode===201){
    console.log("Inserted data");
  } else if (result.statusCode===200){
    console.log("Updated data");
  } else {
    console.log(`unexpected statusCode ${result.statusCode}`);
  }
}