Добавление кода JavaScript для работы с Cosmos DB
В этом уроке вы узнаете, как использовать такие ключевое слово SQL, как LIKE, JOIN и WHERE для запроса данных с помощью пакета SDK Cosmos.
Операции запроса в контейнере
Операции запроса относятся к контейнеру. Так как запрос выполняется в самом контейнере, не требуется использовать правильное имя контейнера, например products
. В справочной документации по пакету SDK или на портале может отображаться имя контейнера, например root
или c
указание контейнера.
Запрос всех документов
Чтобы найти документы в контейнере базы данных Cosmos DB Core (SQL), используйте метод запроса SDK в объекте контейнера с спецификацией запроса. Спецификация запроса требует query
свойства и свойства параметра parameters
.
Свойство | Цель |
---|---|
запрос (обязательный) | Текст ЗАПРОСА SQL. Простой запрос .select * from products |
параметры (необязательно) | Подстановка переменной в запрос. Имя соответствует имени, используемому в запросе, и значение является фактической подстановкой. Можно указать до 10 параметров. |
const querySpecification = {
query: `select * from products`,
parameters: undefined
};
Этот запрос возвращает все документы в контейнере.
Запрос документов по имени с помощью LIKE в контейнере
Чтобы уточнить поиск, но по-прежнему обеспечить некоторую гибкость, используйте like ключевое слово, чтобы разрешить любые совпадения в свойстве документа, где свойство имени документа содержит значение 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-запрос был отформатирован только для удобочитаемости и не должен использоваться с пакетом SDK Cosmos DB.
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 помогает убедиться, что данные добавляются, если они не существуют, и обновляются, если данные существуют. Пакет SDK JavaScript возвращает код состояния, указывающий, какие действия были выполнены:
Upsert statusCode | Значение |
---|---|
201 | Insert |
200 | Update |
В следующем 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}`);
}
}