Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion content/develop/clients/nodejs/produsage.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ categories:
description: Get your Node.js app ready for production
linkTitle: Production usage
title: Production usage
weight: 3
weight: 5
---

The following sections explain how to handle situations that may occur
Expand Down
166 changes: 166 additions & 0 deletions content/develop/clients/nodejs/queryjson.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
---
categories:
- docs
- develop
- stack
- oss
- rs
- rc
- oss
- kubernetes
- clients
description: Learn how to use the Redis Query Engine with JSON
linkTitle: Index and query JSON
title: Example - Index and query JSON documents
weight: 2
---

This example shows how to create a
[search index]({{< relref "/develop/interact/search-and-query/indexing" >}})
for [JSON]({{< relref "/develop/data-types/json" >}}) data and
run queries against the index.

Make sure that you have Redis Stack and `node-redis` installed.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Andy: Please make a note to change Redis Stack to Redis Community Edition (CE) when CE8 ships.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do.


Start by importing dependencies:

```js
import {
createClient,
SchemaFieldTypes,
AggregateGroupByReducers,
AggregateSteps,
} from 'redis';
```

Connect to the database:

```js
const client = await createClient();
await client.connect();
```

Create some test data to add to the database:

```js
const user1 = {
name: 'Paul John',
email: '[email protected]',
age: 42,
city: 'London'
};

const user2 = {
name: 'Eden Zamir',
email: '[email protected]',
age: 29,
city: 'Tel Aviv'
};

const user3 = {
name: 'Paul Zamir',
email: '[email protected]',
age: 35,
city: 'Tel Aviv'
};
```

Create an index. In this example, only JSON documents with the key prefix `user:` are indexed. For more information, see [Query syntax]({{< relref "/develop/interact/search-and-query/query/" >}}).

```js
await client.ft.create('idx:users', {
'$.name': {
type: SchemaFieldTypes.TEXT,
AS: 'name'
},
'$.city': {
type: SchemaFieldTypes.TEXT,
AS: 'city'
},
'$.age': {
type: SchemaFieldTypes.NUMERIC,
AS: 'age'
}
}, {
ON: 'JSON',
PREFIX: 'user:'
});
```

Add the three sets of user data to the database as
[JSON]({{< relref "/develop/data-types/json" >}}) objects.
If you use keys with the `user:` prefix then Redis will index the
objects automatically as you add them. Note that placing
the commands in a `Promise.all()` call is an easy way to create a
[pipeline]({{< relref "/develop/clients/nodejs/transpipe" >}}),
which is more efficient than sending the commands individually.

```js
const [user1Reply, user2Reply, user3Reply] = await Promise.all([
client.json.set('user:1', '$', user1),
client.json.set('user:2', '$', user2),
client.json.set('user:3', '$', user3)
]);
```

You can now use the index to search the JSON objects. The
[query]({{< relref "/develop/interact/search-and-query/query" >}})
below searches for objects that have the text "Paul" in any field
and have an `age` value in the range 30 to 40:

```js
let findPaulResult = await client.ft.search('idx:users', 'Paul @age:[30 40]');

console.log(findPaulResult.total); // >>> 1

findPaulResult.documents.forEach(doc => {
console.log(`ID: ${doc.id}, name: ${doc.value.name}, age: ${doc.value.age}`);
});
```

Specify query options to return only the `city` field:

```js
let citiesResult = await client.ft.search('idx:users', '*',{
RETURN: 'city'
});

console.log(citiesResult.total); // >>> 3

citiesResult.documents.forEach(cityDoc => {
console.log(cityDoc.value);
});
```

Use an
[aggregation query]({{< relref "/develop/interact/search-and-query/query/aggregation" >}})
to count all users in each city.

```js
let aggResult = await client.ft.aggregate('idx:users', '*', {
STEPS: [{
type: AggregateSteps.GROUPBY,
properties: '@city',
REDUCE: [{
type: AggregateGroupByReducers.COUNT,
AS: 'count'
}]
}]
});

console.log(aggResult.total); // >>> 2

aggResult.results.forEach(result => {
console.log(`${result.city} - ${result.count}`);
});
```

Finally, close the connection to Redis.

```js
await client.quit();
```


See the [Redis Query Engine]({{< relref "/develop/interact/search-and-query" >}}) docs
for a full description of all query features with examples.
2 changes: 1 addition & 1 deletion content/develop/clients/nodejs/transpipe.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ categories:
description: Learn how to use Redis pipelines and transactions
linkTitle: Pipelines/transactions
title: Pipelines and transactions
weight: 5
weight: 4
---

Redis lets you send a sequence of commands to the server together in a batch.
Expand Down
2 changes: 1 addition & 1 deletion content/develop/clients/nodejs/vecsearch.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ categories:
description: Learn how to index and query vector embeddings with Redis
linkTitle: Index and query vectors
title: Index and query vectors
weight: 4
weight: 3
---

[Redis Query Engine]({{< relref "/develop/interact/search-and-query" >}})
Expand Down