Subscribe Filters
PubNub's subscribe filters provide comprehensive server-side message filtering capabilities. You can route messages based on payload content, metadata, and complex business logic.
Filters are applied before messages reach your client, reducing bandwidth and improving application performance.
Filtering App Context data
You can filter App Context data (users, channels, memberships) using App Context Filtering.
Overview
Subscribe filters use a powerful expression language to evaluate messages against your criteria. Only messages that match your filter expressions are delivered to your subscribers. Non-matching messages are filtered out server-side.
Core benefits:
- Real-time personalization - Each subscriber receives only relevant messages based on their preferences, location, permissions, or context without requiring separate channels
- Dynamic multi-tenancy - Single channel serves multiple user segments with different filtering rules, enabling scalable SaaS architectures without channel proliferation
- Intelligent event routing - Route messages based on complex business logic combining user roles, content types, geographic boundaries, and priority levels in real-time
- Scalable sampling & analytics - Filter high-volume data streams for analytics, monitoring, and sampling without overwhelming downstream systems or clients
Filter expression fundamentals
Use filters against two data sources: message payload (data.*
) and message metadata (meta.*
).
Data access
Subscribe filters can access two main data sources within each message:
Prefix | Data Source | Example Fields | Access Pattern |
---|---|---|---|
data.* | Message payload | data.text , data.type , data.score | Any field in published message content |
meta.* | Message metadata | meta.priority , meta.region , meta.level | Metadata attached via meta parameter when publishing |
Supported operators
Category | Operators | Description | Examples |
---|---|---|---|
Comparison | == , != , > , < , >= , <= | Standard comparisons | meta.level > 5 , data.score >= 80 |
Pattern | LIKE , CONTAINS | Wildcard and substring matching | meta.category LIKE "news*" , data.text CONTAINS "urgent" |
Logical | && , || , ! | Boolean logic operators | (meta.priority == "high") && (data.type == "alert") |
Arithmetic | + , - , * , / , % | Mathematical operations | meta.userId % 10 == 0 , data.score > (meta.threshold + 5) |
Access | [index] , ["key"] | Array and object access | meta.tags[0] == "urgent" , meta.user["role"] == "admin" |
Basic filtering
Use simple expressions to match fields in data.*
or meta.*
; start with strings, then numbers.
String filtering
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Exact string matching
2pubnub.setFilterExpression('meta.priority == "high"');
3pubnub.setFilterExpression('data.category != "test"');
4
5// Multiple string conditions
6pubnub.setFilterExpression('meta.region == "San Francisco" && data.type == "alert"');
1// String filter configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "meta.priority == \"high\""
7)
8let pubnub = PubNub(configuration: config)
9
10// Multiple string conditions
11let complexConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "meta.region == \"San Francisco\" && data.type == \"alert\""
show all 16 lines1// String filter configuration
2pubnub.filterExpression = @"meta.priority == \"high\"";
3
4// Complex string filtering
5pubnub.filterExpression = @"meta.region == \"San Francisco\" && data.type == \"alert\"";
1// String filter configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("meta.priority == \"high\"");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Multiple string conditions
8PNConfiguration.Builder complexBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
9complexBuilder.publishKey("myPublishKey");
10complexBuilder.setFilterExpression("meta.region == \"San Francisco\" && data.type == \"alert\"");
11PubNub complexPubNub = PubNub.create(complexBuilder.build());
1// Set string filters via configuration
2pnconfig.FilterExpression = "meta.priority == \"high\"";
3pnconfig.FilterExpression = "data.category != \"test\"";
4
5// Complex string filtering
6pnconfig.FilterExpression = "meta.region == \"San Francisco\" && data.type == \"alert\"";
1# Set string filters via configuration
2pnconfig.filter_expression = 'meta.priority == "high"'
3pnconfig.filter_expression = 'data.category != "test"'
4
5# Multiple string conditions
6pnconfig.filter_expression = 'meta.region == "San Francisco" && data.type == "alert"'
Numeric filtering
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Numeric comparisons
2pubnub.setFilterExpression('meta.level > 10');
3pubnub.setFilterExpression('data.score >= 80');
4pubnub.setFilterExpression('meta.priority <= 3');
5
6// Range filtering
7pubnub.setFilterExpression('meta.score >= 80 && meta.score <= 100');
8
9// Calculated thresholds
10pubnub.setFilterExpression('data.usage > (data.limit * 0.8)');
1// Numeric filter configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "meta.level > 10"
7)
8let pubnub = PubNub(configuration: config)
9
10// Range filtering example
11let rangeConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "meta.score >= 80 && meta.score <= 100"
show all 16 lines1// Numeric filter configuration
2pubnub.filterExpression = @"meta.level > 10";
3
4// Range filtering
5pubnub.filterExpression = @"meta.score >= 80 && meta.score <= 100";
1// Numeric filter configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("meta.level > 10");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Range filtering
8PNConfiguration.Builder rangeBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
9rangeBuilder.publishKey("myPublishKey");
10rangeBuilder.setFilterExpression("meta.score >= 80 && meta.score <= 100");
11PubNub rangePubNub = PubNub.create(rangeBuilder.build());
1// Numeric comparisons
2pnconfig.FilterExpression = "meta.level > 10";
3pnconfig.FilterExpression = "data.score >= 80";
4pnconfig.FilterExpression = "meta.priority <= 3";
5
6// Range filtering
7pnconfig.FilterExpression = "meta.score >= 80 && meta.score <= 100";
1# Numeric comparisons
2pnconfig.filter_expression = 'meta.level > 10'
3pnconfig.filter_expression = 'data.score >= 80'
4pnconfig.filter_expression = 'meta.priority <= 3'
5
6# Range filtering
7pnconfig.filter_expression = 'meta.score >= 80 && meta.score <= 100'
Pattern matching
Use LIKE
for wildcard matches and CONTAINS
for substring searches on fields in data.*
and meta.*
.
LIKE operator (wildcard matching)
The LIKE
operator provides powerful pattern matching with wildcard support.
Wildcard rules include:
- Use
*
for wildcard matching *
can be at start, end, or both:"*middle*"
,"prefix*"
,"*suffix"
- Escape literal asterisks with backslash:
"literal\*"
- Pattern matching is case-insensitive
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Wildcard patterns
2pubnub.setFilterExpression('meta.category LIKE "news*"'); // Starts with "news"
3pubnub.setFilterExpression('data.title LIKE "*breaking*"'); // Contains "breaking"
4pubnub.setFilterExpression('meta.version LIKE "2.1*"'); // Version prefix
5
6// Complex pattern combinations
7pubnub.setFilterExpression('data.subject LIKE "*[URGENT]*" && data.body CONTAINS "maintenance"');
1// Wildcard pattern configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "meta.category LIKE \"news*\""
7)
8let pubnub = PubNub(configuration: config)
9
10// Additional pattern examples
11let patternConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "data.title LIKE \"*breaking*\""
show all 16 lines1// Wildcard patterns via configuration
2pubnub.filterExpression = @"meta.category LIKE \"news*\"";
3
4// Additional pattern examples
5pubnub.filterExpression = @"data.title LIKE \"*breaking*\"";
6pubnub.filterExpression = @"meta.version LIKE \"2.1*\"";
1// Wildcard pattern configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("meta.category LIKE \"news*\"");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Additional pattern examples
8configBuilder.setFilterExpression("data.title LIKE \"*breaking*\"");
9configBuilder.setFilterExpression("meta.version LIKE \"2.1*\"");
1// Wildcard patterns
2pnconfig.FilterExpression = "meta.category LIKE \"news*\"";
3pnconfig.FilterExpression = "data.title LIKE \"*breaking*\"";
4pnconfig.FilterExpression = "meta.version LIKE \"2.1*\"";
1# Wildcard patterns
2pnconfig.filter_expression = 'meta.category LIKE "news*"'
3
4// Additional pattern examples
5pnconfig.filter_expression = 'data.title LIKE "*breaking*"'
6pnconfig.filter_expression = 'meta.version LIKE "2.1*"'
CONTAINS operator (substring search)
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Substring search
2pubnub.setFilterExpression('meta.tags CONTAINS "urgent"');
3pubnub.setFilterExpression('data.description CONTAINS "error"');
4
5// Multiple substring conditions
6pubnub.setFilterExpression('data.text CONTAINS "urgent" && meta.category CONTAINS "alert"');
1// Substring search configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "meta.tags CONTAINS \"urgent\""
7)
8let pubnub = PubNub(configuration: config)
9
10// Additional CONTAINS example
11let containsConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "data.description CONTAINS \"error\""
show all 16 lines1// Substring search
2pubnub.filterExpression = @"meta.tags CONTAINS \"urgent\"";
3
4// Additional CONTAINS examples
5pubnub.filterExpression = @"data.description CONTAINS \"error\"";
1// Substring search configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("meta.tags CONTAINS \"urgent\"");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Additional CONTAINS examples
8configBuilder.setFilterExpression("data.description CONTAINS \"error\"");
1// Substring search
2pnconfig.FilterExpression = "meta.tags CONTAINS \"urgent\"";
3pnconfig.FilterExpression = "data.description CONTAINS \"error\"";
1# Substring search
2pnconfig.filter_expression = 'meta.tags CONTAINS "urgent"'
3
4// Additional CONTAINS examples
5pnconfig.filter_expression = 'data.description CONTAINS "error"'
Advanced filtering
Use these patterns to access arrays and objects, perform arithmetic, and handle booleans in subscribe filter expressions.
Array and object access
Subscribe filters support direct access to array elements and object properties within both payload and metadata.
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Array element access
2pubnub.setFilterExpression('meta.tags[0] == "urgent"'); // First element
3pubnub.setFilterExpression('data.recipients[1] LIKE "*@company.com"'); // Second element
4
5// Object property access
6pubnub.setFilterExpression('meta.user["role"] == "admin"'); // Object key access
7pubnub.setFilterExpression('data.config["enabled"] == "true"'); // Nested object
8
9// Combined array and object access
10pubnub.setFilterExpression('meta.permissions[0] == "read" && data.user["department"] == "engineering"');
1// Array and object access configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "meta.tags[0] == \"urgent\""
7)
8let pubnub = PubNub(configuration: config)
9
10// Object access examples
11let objectConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "meta.user[\"role\"] == \"admin\""
show all 16 lines1// Array and object access
2pubnub.filterExpression = @"meta.tags[0] == \"urgent\"";
3
4// Object access examples
5pubnub.filterExpression = @"meta.user[\"role\"] == \"admin\"";
6pubnub.filterExpression = @"data.config[\"enabled\"] == \"true\"";
1// Array and object access configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("meta.tags[0] == \"urgent\"");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Object access examples
8configBuilder.setFilterExpression("meta.user[\"role\"] == \"admin\"");
9configBuilder.setFilterExpression("data.config[\"enabled\"] == \"true\"");
1// Array and object access
2pnconfig.FilterExpression = "meta.tags[0] == \"urgent\"";
3pnconfig.FilterExpression = "meta.user[\"role\"] == \"admin\"";
4pnconfig.FilterExpression = "data.config[\"enabled\"] == \"true\"";
1# Array and object access
2pnconfig.filter_expression = 'meta.tags[0] == "urgent"'
3
4// Object access examples
5pnconfig.filter_expression = 'meta.user["role"] == "admin"'
6pnconfig.filter_expression = 'data.config["enabled"] == "true"'
Single-level access only
Array and object access supports one level of indexing (meta.array[0]
, meta.object["key"]
). Multi-level chained access (meta.data["array"][0]
) is not supported.
Arithmetic operations
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Modulo operations for sampling
2pubnub.setFilterExpression('meta.userId % 10 == 0'); // 10% sampling
3pubnub.setFilterExpression('meta.messageId % 100 == 0'); // 1% sampling
4
5// Arithmetic calculations in filters
6pubnub.setFilterExpression('data.score > (meta.baseline + 10)');
7pubnub.setFilterExpression('meta.attempts < (meta.maxRetries - 1)');
8
9// Complex arithmetic expressions
10pubnub.setFilterExpression('(data.total - data.used) > (data.limit * 0.2)');
1// Modulo operations configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "meta.userId % 10 == 0"
7)
8let pubnub = PubNub(configuration: config)
9
10// Arithmetic calculations example
11let arithmeticConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "data.score > (meta.baseline + 10)"
show all 16 lines1// Modulo operations via configuration
2pubnub.filterExpression = @"meta.userId % 10 == 0";
3
4// Arithmetic calculations
5pubnub.filterExpression = @"meta.messageId % 100 == 0";
6pubnub.filterExpression = @"data.score > (meta.baseline + 10)";
1// Modulo operations configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("meta.userId % 10 == 0");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Arithmetic calculations
8configBuilder.setFilterExpression("meta.messageId % 100 == 0");
9configBuilder.setFilterExpression("data.score > (meta.baseline + 10)");
1// Modulo operations
2pnconfig.FilterExpression = "meta.userId % 10 == 0";
3pnconfig.FilterExpression = "meta.messageId % 100 == 0";
4
5// Arithmetic calculations
6pnconfig.FilterExpression = "data.score > (meta.baseline + 10)";
1# Modulo operations
2pnconfig.filter_expression = 'meta.userId % 10 == 0'
3pnconfig.filter_expression = 'meta.messageId % 100 == 0'
4
5# Arithmetic calculations
6pnconfig.filter_expression = 'data.score > (meta.baseline + 10)'
Boolean value handling
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Boolean values as strings (recommended approach)
2pubnub.setFilterExpression('meta.enabled == "true"');
3pubnub.setFilterExpression('meta.active == "false"');
4pubnub.setFilterExpression('meta.verified != "false"');
5
6// Numeric boolean flags (alternative)
7pubnub.setFilterExpression('meta.isActive == 1'); // 1 for true
8pubnub.setFilterExpression('meta.isDisabled == 0'); // 0 for false
1// Boolean string configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "meta.enabled == \"true\""
7)
8let pubnub = PubNub(configuration: config)
9
10// Numeric boolean example
11let boolConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "meta.isActive == 1"
show all 16 lines1// Boolean as string via configuration
2pubnub.filterExpression = @"meta.enabled == \"true\"";
3
4// Numeric boolean examples
5pubnub.filterExpression = @"meta.active == \"false\"";
6pubnub.filterExpression = @"meta.isActive == 1";
1// Boolean string configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("meta.enabled == \"true\"");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Numeric boolean examples
8configBuilder.setFilterExpression("meta.active == \"false\"");
9configBuilder.setFilterExpression("meta.isActive == 1");
1// Boolean as string
2pnconfig.FilterExpression = "meta.enabled == \"true\"";
3pnconfig.FilterExpression = "meta.active == \"false\"";
4
5// Numeric boolean
6pnconfig.FilterExpression = "meta.isActive == 1";
1# Boolean as string
2pnconfig.filter_expression = 'meta.enabled == "true"'
3pnconfig.filter_expression = 'meta.active == "false"'
4
5# Numeric boolean
6pnconfig.filter_expression = 'meta.isActive == 1'
Boolean literal limitation
Use string comparison ("true"/"false") or numeric flags (1/0) in filter expressions. The filtering system treats JSON boolean values as strings.
Complex expressions
Build complex filters by combining conditions (AND/OR), nesting expressions, and using parentheses for clarity.
Compound logic
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// AND expressions
2pubnub.setFilterExpression('(meta.priority == "high") && (data.type == "alert")');
3pubnub.setFilterExpression('meta.level > 5 && meta.region == "San Francisco"');
4
5// OR expressions
6pubnub.setFilterExpression('(meta.priority == "high") || (meta.priority == "critical")');
7pubnub.setFilterExpression('data.category == "news" || data.category == "sports"');
8
9// Nested logical expressions
10pubnub.setFilterExpression('((meta.priority == "high") || (meta.priority == "critical")) && (data.score > 80)');
11
12// Cross-field filtering
13pubnub.setFilterExpression('(meta.userRole == "admin") && (data.action == "delete") && (data.target["type"] == "production")');
1// Compound expressions configuration
2let config = PubNubConfiguration(
3 publishKey: "myPublishKey",
4 subscribeKey: "mySubscribeKey",
5 userId: "myUserId",
6 filterExpression: "(meta.priority == \"high\") && (data.type == \"alert\")"
7)
8let pubnub = PubNub(configuration: config)
9
10// Complex nested expressions
11let complexConfig = PubNubConfiguration(
12 publishKey: "myPublishKey",
13 subscribeKey: "mySubscribeKey",
14 userId: "myUserId",
15 filterExpression: "((meta.priority == \"high\") || (meta.priority == \"critical\")) && (data.score > 80)"
show all 16 lines1// Compound expressions via configuration
2pubnub.filterExpression = @"(meta.priority == \"high\") && (data.type == \"alert\")";
3
4// Additional compound examples
5pubnub.filterExpression = @"(meta.priority == \"high\") || (meta.priority == \"critical\")";
6pubnub.filterExpression = @"((meta.priority == \"high\") || (meta.priority == \"critical\")) && (data.score > 80)";
1// Compound expressions configuration
2PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
3configBuilder.publishKey("myPublishKey");
4configBuilder.setFilterExpression("(meta.priority == \"high\") && (data.type == \"alert\")");
5PubNub pubnub = PubNub.create(configBuilder.build());
6
7// Additional compound examples
8configBuilder.setFilterExpression("(meta.priority == \"high\") || (meta.priority == \"critical\")");
9configBuilder.setFilterExpression("((meta.priority == \"high\") || (meta.priority == \"critical\")) && (data.score > 80)");
1// Compound expressions
2pnconfig.FilterExpression = "(meta.priority == \"high\") && (data.type == \"alert\")";
3pnconfig.FilterExpression = "(meta.priority == \"high\") || (meta.priority == \"critical\")";
4pnconfig.FilterExpression = "((meta.priority == \"high\") || (meta.priority == \"critical\")) && (data.score > 80)";
1# Compound expressions
2pnconfig.filter_expression = '(meta.priority == "high") && (data.type == "alert")'
3
4// Additional compound examples
5pnconfig.filter_expression = '(meta.priority == "high") || (meta.priority == "critical")'
6pnconfig.filter_expression = '((meta.priority == "high") || (meta.priority == "critical")) && (data.score > 80)'
Operator precedence
Expressions are evaluated according to standard mathematical precedence:
- Parentheses:
()
- Unary operators:
!
(logical NOT),~
(bitwise NOT) - Arithmetic:
*
,/
,%
(left-to-right) - Arithmetic:
+
,-
(left-to-right) - Comparison:
==
,!=
,<
,>
,<=
,>=
,LIKE
,CONTAINS
- Logical AND:
&&
- Logical OR:
||
Parentheses for clarity
Use parentheses to make precedence explicit in complex expressions.
Real-world applications
Use these examples to apply subscribe filters in chat, geolocation, IoT, and trading scenarios.
Chat application filtering
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Moderator message filtering
2// This filter ensures only messages from moderators or admins with non-empty text are received,
3// useful for administrative channels where only staff communications should be visible.
4pubnub.setFilterExpression('(meta.user["role"] == "moderator" || meta.user["role"] == "admin") && data.text != ""');
5
6// Direct message targeting
7// This filter delivers messages only to users who are participants in a specific conversation,
8// ensuring private messages reach only the intended recipients.
9pubnub.setFilterExpression('meta.conversation["participants"] CONTAINS "' + currentUserId + '" && data.type == "direct_message"');
10
11// Block list filtering
12// This filter blocks messages from multiple specific users that have been blocked by the current user,
13// providing a comprehensive user blocking mechanism for chat applications.
14pubnub.setFilterExpression('meta.publisher != "user123" && meta.publisher != "user456" && meta.publisher != "user789" && meta.publisher != "user101" && meta.publisher != "user202" && meta.publisher != "user303" && meta.publisher != "user404" && meta.publisher != "user505" && meta.publisher != "user606" && meta.publisher != "user707"');
15
1// Moderator message filtering
2// This filter ensures only messages from moderators or admins with non-empty text are received,
3// useful for administrative channels where only staff communications should be visible.
4let config = PubNubConfiguration(
5 publishKey: "myPublishKey",
6 subscribeKey: "mySubscribeKey",
7 userId: "myUserId",
8 filterExpression: "(meta.user[\"role\"] == \"moderator\" || meta.user[\"role\"] == \"admin\") && data.text != \"\""
9)
10
11// Direct message targeting
12// This filter delivers messages only to users who are participants in a specific conversation,
13// ensuring private messages reach only the intended recipients.
14let config = PubNubConfiguration(
15 publishKey: "myPublishKey",
show all 30 lines1// Moderator message filtering
2// This filter ensures only messages from moderators or admins with non-empty text are received,
3// useful for administrative channels where only staff communications should be visible.
4pubnub.filterExpression = @"(meta.user[\"role\"] == \"moderator\" || meta.user[\"role\"] == \"admin\") && data.text != \"\"";
5
6// Direct message targeting
7// This filter delivers messages only to users who are participants in a specific conversation,
8// ensuring private messages reach only the intended recipients.
9pubnub.filterExpression = [NSString stringWithFormat:@"meta.conversation[\"participants\"] CONTAINS \"%@\" && data.type == \"direct_message\"", currentUserId];
10
11// Block list filtering
12// This filter blocks messages from multiple specific users that have been blocked by the current user,
13// providing a comprehensive user blocking mechanism for chat applications.
14pubnub.filterExpression = @"meta.publisher != \"user123\" && meta.publisher != \"user456\" && meta.publisher != \"user789\" && meta.publisher != \"user101\" && meta.publisher != \"user202\" && meta.publisher != \"user303\" && meta.publisher != \"user404\" && meta.publisher != \"user505\" && meta.publisher != \"user606\" && meta.publisher != \"user707\"";
15
1// Moderator message filtering
2// This filter ensures only messages from moderators or admins with non-empty text are received,
3// useful for administrative channels where only staff communications should be visible.
4PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
5configBuilder.publishKey("myPublishKey");
6configBuilder.setFilterExpression("(meta.user[\"role\"] == \"moderator\" || meta.user[\"role\"] == \"admin\") && data.text != \"\"");
7PubNub pubnub = PubNub.create(configBuilder.build());
8
9// Direct message targeting
10// This filter delivers messages only to users who are participants in a specific conversation,
11// ensuring private messages reach only the intended recipients.
12PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
13configBuilder.publishKey("myPublishKey");
14configBuilder.setFilterExpression("meta.conversation[\"participants\"] CONTAINS \"" + currentUserId + "\" && data.type == \"direct_message\"");
15PubNub pubnub = PubNub.create(configBuilder.build());
show all 24 lines1// Moderator message filtering
2// This filter ensures only messages from moderators or admins with non-empty text are received,
3// useful for administrative channels where only staff communications should be visible.
4pnconfig.FilterExpression = "(meta.user[\"role\"] == \"moderator\" || meta.user[\"role\"] == \"admin\") && data.text != \"\"";
5
6// Direct message targeting
7// This filter delivers messages only to users who are participants in a specific conversation,
8// ensuring private messages reach only the intended recipients.
9pnconfig.FilterExpression = $"meta.conversation[\"participants\"] CONTAINS \"{currentUserId}\" && data.type == \"direct_message\"";
10
11// Block list filtering
12// This filter blocks messages from multiple specific users that have been blocked by the current user,
13// providing a comprehensive user blocking mechanism for chat applications.
14pnconfig.FilterExpression = "meta.publisher != \"user123\" && meta.publisher != \"user456\" && meta.publisher != \"user789\" && meta.publisher != \"user101\" && meta.publisher != \"user202\" && meta.publisher != \"user303\" && meta.publisher != \"user404\" && meta.publisher != \"user505\" && meta.publisher != \"user606\" && meta.publisher != \"user707\"";
15
1# Moderator message filtering
2# This filter ensures only messages from moderators or admins with non-empty text are received,
3# useful for administrative channels where only staff communications should be visible.
4pnconfig.filter_expression = '(meta.user["role"] == "moderator" || meta.user["role"] == "admin") && data.text != ""'
5
6# Direct message targeting
7# This filter delivers messages only to users who are participants in a specific conversation,
8# ensuring private messages reach only the intended recipients.
9pnconfig.filter_expression = f'meta.conversation["participants"] CONTAINS "{current_user_id}" && data.type == "direct_message"'
10
11# Block list filtering
12# This filter blocks messages from multiple specific users that have been blocked by the current user,
13# providing a comprehensive user blocking mechanism for chat applications.
14pnconfig.filter_expression = 'meta.publisher != "user123" && meta.publisher != "user456" && meta.publisher != "user789" && meta.publisher != "user101" && meta.publisher != "user202" && meta.publisher != "user303" && meta.publisher != "user404" && meta.publisher != "user505" && meta.publisher != "user606" && meta.publisher != "user707"'
15
Geolocation filtering
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Geo-fence filtering (100m rectangular boundary)
2// This filter creates a rectangular boundary around a specific location, useful for location-based
3// notifications like nearby restaurant deals or local event announcements.
4pubnub.setFilterExpression('(data.location["lat"] >= 37.7849 && data.location["lat"] <= 37.7869) && (data.location["lng"] >= -122.4094 && data.location["lng"] <= -122.4074)');
5
6// Neighborhood-level filtering
7// This filter targets messages to specific neighborhoods or districts, ideal for community apps,
8// local news, or area-specific services combining geographic boundaries with content type filtering.
9pubnub.setFilterExpression('meta.address["neighborhood"] LIKE "*mission*" && data.type == "local_event"');
10
11// Emergency services - nearby incidents
12// This filter delivers high-priority emergency alerts to users in specific geographic areas,
13// essential for emergency response systems and public safety notifications.
14pubnub.setFilterExpression('meta.emergency["priority"] >= 3 && data.location["zipcode"] == "94110" && meta.services CONTAINS "fire"');
1// Geo-fence filtering (100m rectangular boundary)
2// This filter creates a rectangular boundary around a specific location, useful for location-based
3// notifications like nearby restaurant deals or local event announcements.
4let geoConfig = PubNubConfiguration(
5 publishKey: "myPublishKey",
6 subscribeKey: "mySubscribeKey",
7 userId: "myUserId",
8 filterExpression: "(data.location[\"lat\"] >= 37.7849 && data.location[\"lat\"] <= 37.7869) && (data.location[\"lng\"] >= -122.4094 && data.location[\"lng\"] <= -122.4074)"
9)
10
11// Neighborhood-level filtering
12// This filter targets messages to specific neighborhoods or districts, ideal for community apps,
13// local news, or area-specific services combining geographic boundaries with content type filtering.
14let neighborhoodConfig = PubNubConfiguration(
15 publishKey: "myPublishKey",
show all 29 lines1// Geo-fence filtering (100m rectangular boundary)
2// This filter creates a rectangular boundary around a specific location, useful for location-based
3// notifications like nearby restaurant deals or local event announcements.
4pubnub.filterExpression = @"(data.location[\"lat\"] >= 37.7849 && data.location[\"lat\"] <= 37.7869) && (data.location[\"lng\"] >= -122.4094 && data.location[\"lng\"] <= -122.4074)";
5
6// Neighborhood-level filtering
7// This filter targets messages to specific neighborhoods or districts, ideal for community apps,
8// local news, or area-specific services combining geographic boundaries with content type filtering.
9pubnub.filterExpression = @"meta.address[\"neighborhood\"] LIKE \"*mission*\" && data.type == \"local_event\"";
10
11// Emergency services - nearby incidents
12// This filter delivers high-priority emergency alerts to users in specific geographic areas,
13// essential for emergency response systems and public safety notifications.
14pubnub.filterExpression = @"meta.emergency[\"priority\"] >= 3 && data.location[\"zipcode\"] == \"94110\" && meta.services CONTAINS \"fire\"";
1// Geo-fence filtering (100m rectangular boundary)
2// This filter creates a rectangular boundary around a specific location, useful for location-based
3// notifications like nearby restaurant deals or local event announcements.
4PNConfiguration.Builder geoBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
5geoBuilder.publishKey("myPublishKey");
6geoBuilder.setFilterExpression("(data.location[\"lat\"] >= 37.7849 && data.location[\"lat\"] <= 37.7869) && (data.location[\"lng\"] >= -122.4094 && data.location[\"lng\"] <= -122.4074)");
7PubNub geoPubNub = PubNub.create(geoBuilder.build());
8
9// Neighborhood-level filtering
10// This filter targets messages to specific neighborhoods or districts, ideal for community apps,
11// local news, or area-specific services combining geographic boundaries with content type filtering.
12PNConfiguration.Builder neighborhoodBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
13neighborhoodBuilder.publishKey("myPublishKey");
14neighborhoodBuilder.setFilterExpression("meta.address[\"neighborhood\"] LIKE \"*mission*\" && data.type == \"local_event\"");
15PubNub neighborhoodPubNub = PubNub.create(neighborhoodBuilder.build());
show all 23 lines1// Geo-fence filtering (100m rectangular boundary)
2// This filter creates a rectangular boundary around a specific location, useful for location-based
3// notifications like nearby restaurant deals or local event announcements.
4PNConfiguration geoConfig = new PNConfiguration(new UserId("myUserId"));
5geoConfig.SubscribeKey = "mySubscribeKey";
6geoConfig.PublishKey = "myPublishKey";
7geoConfig.FilterExpression = "(data.location[\"lat\"] >= 37.7849 && data.location[\"lat\"] <= 37.7869) && (data.location[\"lng\"] >= -122.4094 && data.location[\"lng\"] <= -122.4074)";
8Pubnub geoPubNub = new Pubnub(geoConfig);
9
10// Neighborhood-level filtering
11// This filter targets messages to specific neighborhoods or districts, ideal for community apps,
12// local news, or area-specific services combining geographic boundaries with content type filtering.
13PNConfiguration neighborhoodConfig = new PNConfiguration(new UserId("myUserId"));
14neighborhoodConfig.SubscribeKey = "mySubscribeKey";
15neighborhoodConfig.PublishKey = "myPublishKey";
show all 26 lines1# Geo-fence filtering (100m rectangular boundary)
2# This filter creates a rectangular boundary around a specific location, useful for location-based
3# notifications like nearby restaurant deals or local event announcements.
4pnconfig.filter_expression = '(data.location["lat"] >= 37.7849 && data.location["lat"] <= 37.7869) && (data.location["lng"] >= -122.4094 && data.location["lng"] <= -122.4074)'
5
6# Neighborhood-level filtering
7# This filter targets messages to specific neighborhoods or districts, ideal for community apps,
8# local news, or area-specific services combining geographic boundaries with content type filtering.
9pnconfig.filter_expression = 'meta.address["neighborhood"] LIKE "*mission*" && data.type == "local_event"'
10
11# Emergency services - nearby incidents
12# This filter delivers high-priority emergency alerts to users in specific geographic areas,
13# essential for emergency response systems and public safety notifications.
14pnconfig.filter_expression = 'meta.emergency["priority"] >= 3 && data.location["zipcode"] == "94110" && meta.services CONTAINS "fire"'
IoT data stream filtering
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Sensor data filtering
2// This filter monitors specific sensor types and triggers alerts when values exceed predefined thresholds,
3// essential for environmental monitoring and automated alert systems in smart buildings or industrial facilities.
4pubnub.setFilterExpression('data.sensor["type"] == "temperature" && data.value > meta.thresholds["high"]');
5
6// Device health monitoring
7// This filter identifies devices that need attention by monitoring battery levels and critical errors,
8// enabling proactive maintenance and preventing device failures in IoT deployments.
9pubnub.setFilterExpression('meta.device["status"] != "maintenance" && (data.battery < 20 || data.errors[0] CONTAINS "critical")');
10
11// Time-based sampling
12// This filter collects periodic reports from a subset of devices to reduce data volume while maintaining visibility,
13// useful for large-scale IoT deployments where continuous monitoring of all devices would be overwhelming.
14pubnub.setFilterExpression('meta.deviceId % 60 == 0 && data.timestamp LIKE "*:00:*"'); // Hourly reports
1// Sensor data filtering
2// This filter monitors specific sensor types and triggers alerts when values exceed predefined thresholds,
3// essential for environmental monitoring and automated alert systems in smart buildings or industrial facilities.
4let sensorConfig = PubNubConfiguration(
5 publishKey: "myPublishKey",
6 subscribeKey: "mySubscribeKey",
7 userId: "myUserId",
8 filterExpression: "data.sensor[\"type\"] == \"temperature\" && data.value > meta.thresholds[\"high\"]"
9)
10let sensorPubNub = PubNub(configuration: sensorConfig)
11
12// Device health monitoring
13// This filter identifies devices that need attention by monitoring battery levels and critical errors,
14// enabling proactive maintenance and preventing device failures in IoT deployments.
15let deviceConfig = PubNubConfiguration(
show all 31 lines1// Sensor data filtering
2// This filter monitors specific sensor types and triggers alerts when values exceed predefined thresholds,
3// essential for environmental monitoring and automated alert systems in smart buildings or industrial facilities.
4pubnub.filterExpression = @"data.sensor[\"type\"] == \"temperature\" && data.value > meta.thresholds[\"high\"]";
5
6// Device health monitoring
7// This filter identifies devices that need attention by monitoring battery levels and critical errors,
8// enabling proactive maintenance and preventing device failures in IoT deployments.
9pubnub.filterExpression = @"meta.device[\"status\"] != \"maintenance\" && (data.battery < 20 || data.errors[0] CONTAINS \"critical\")";
10
11// Time-based sampling
12// This filter collects periodic reports from a subset of devices to reduce data volume while maintaining visibility,
13// useful for large-scale IoT deployments where continuous monitoring of all devices would be overwhelming.
14pubnub.filterExpression = @"meta.deviceId % 60 == 0 && data.timestamp LIKE \"*:00:*\"";
1// Sensor data filtering
2// This filter monitors specific sensor types and triggers alerts when values exceed predefined thresholds,
3// essential for environmental monitoring and automated alert systems in smart buildings or industrial facilities.
4PNConfiguration.Builder sensorBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
5sensorBuilder.publishKey("myPublishKey");
6sensorBuilder.setFilterExpression("data.sensor[\"type\"] == \"temperature\" && data.value > meta.thresholds[\"high\"]");
7PubNub sensorPubNub = PubNub.create(sensorBuilder.build());
8
9// Device health monitoring
10// This filter identifies devices that need attention by monitoring battery levels and critical errors,
11// enabling proactive maintenance and preventing device failures in IoT deployments.
12PNConfiguration.Builder deviceBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
13deviceBuilder.publishKey("myPublishKey");
14deviceBuilder.setFilterExpression("meta.device[\"status\"] != \"maintenance\" && (data.battery < 20 || data.errors[0] CONTAINS \"critical\")");
15PubNub devicePubNub = PubNub.create(deviceBuilder.build());
show all 23 lines1// Sensor data filtering
2// This filter monitors specific sensor types and triggers alerts when values exceed predefined thresholds,
3// essential for environmental monitoring and automated alert systems in smart buildings or industrial facilities.
4PNConfiguration sensorConfig = new PNConfiguration(new UserId("myUserId"));
5sensorConfig.SubscribeKey = "mySubscribeKey";
6sensorConfig.PublishKey = "myPublishKey";
7sensorConfig.FilterExpression = "data.sensor[\"type\"] == \"temperature\" && data.value > meta.thresholds[\"high\"]";
8Pubnub sensorPubNub = new Pubnub(sensorConfig);
9
10// Device health monitoring
11// This filter identifies devices that need attention by monitoring battery levels and critical errors,
12// enabling proactive maintenance and preventing device failures in IoT deployments.
13PNConfiguration deviceConfig = new PNConfiguration(new UserId("myUserId"));
14deviceConfig.SubscribeKey = "mySubscribeKey";
15deviceConfig.PublishKey = "myPublishKey";
show all 26 lines1# Sensor data filtering
2# This filter monitors specific sensor types and triggers alerts when values exceed predefined thresholds,
3# essential for environmental monitoring and automated alert systems in smart buildings or industrial facilities.
4pnconfig.filter_expression = 'data.sensor["type"] == "temperature" && data.value > meta.thresholds["high"]'
5
6# Device health monitoring
7# This filter identifies devices that need attention by monitoring battery levels and critical errors,
8# enabling proactive maintenance and preventing device failures in IoT deployments.
9pnconfig.filter_expression = 'meta.device["status"] != "maintenance" && (data.battery < 20 || data.errors[0] CONTAINS "critical")'
10
11# Time-based sampling
12# This filter collects periodic reports from a subset of devices to reduce data volume while maintaining visibility,
13# useful for large-scale IoT deployments where continuous monitoring of all devices would be overwhelming.
14pnconfig.filter_expression = 'meta.deviceId % 60 == 0 && data.timestamp LIKE "*:00:*"'
Financial trading filters
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Trading signal filtering
2// This filter delivers cryptocurrency price alerts only when prices exceed user-defined thresholds,
3// enabling personalized trading notifications while filtering out irrelevant market movements.
4pubnub.setFilterExpression('data.symbol LIKE "CRYPTO*" && data.price > meta.user["minPrice"]');
5
6// Risk management
7// This filter enforces trading limits and compliance rules by monitoring position sizes and account restrictions,
8// providing automated risk controls to prevent unauthorized or excessive trading activity.
9pubnub.setFilterExpression('data.position["size"] <= meta.limits["maxPosition"] && !(meta.restrictions CONTAINS "dayTrading")');
10
11// Market event filtering
12// This filter identifies significant market movements by analyzing trade volume and price changes,
13// delivering alerts only for high-impact events that meet minimum transaction value and volatility criteria.
14pubnub.setFilterExpression('(data.volume * data.price) > meta.filters["minValue"] && data.changePercent > 5');
1// Trading signal filtering
2// This filter delivers cryptocurrency price alerts only when prices exceed user-defined thresholds,
3// enabling personalized trading notifications while filtering out irrelevant market movements.
4let tradingConfig = PubNubConfiguration(
5 publishKey: "myPublishKey",
6 subscribeKey: "mySubscribeKey",
7 userId: "myUserId",
8 filterExpression: "data.symbol LIKE \"CRYPTO*\" && data.price > meta.user[\"minPrice\"]"
9)
10let tradingPubNub = PubNub(configuration: tradingConfig)
11
12// Risk management
13// This filter enforces trading limits and compliance rules by monitoring position sizes and account restrictions,
14// providing automated risk controls to prevent unauthorized or excessive trading activity.
15let riskConfig = PubNubConfiguration(
show all 31 lines1// Trading signal filtering
2// This filter delivers cryptocurrency price alerts only when prices exceed user-defined thresholds,
3// enabling personalized trading notifications while filtering out irrelevant market movements.
4pubnub.filterExpression = @"data.symbol LIKE \"CRYPTO*\" && data.price > meta.user[\"minPrice\"]";
5
6// Risk management
7// This filter enforces trading limits and compliance rules by monitoring position sizes and account restrictions,
8// providing automated risk controls to prevent unauthorized or excessive trading activity.
9pubnub.filterExpression = @"data.position[\"size\"] <= meta.limits[\"maxPosition\"] && !(meta.restrictions CONTAINS \"dayTrading\")";
10
11// Market event filtering
12// This filter identifies significant market movements by analyzing trade volume and price changes,
13// delivering alerts only for high-impact events that meet minimum transaction value and volatility criteria.
14pubnub.filterExpression = @"(data.volume * data.price) > meta.filters[\"minValue\"] && data.changePercent > 5";
1// Trading signal filtering
2// This filter delivers cryptocurrency price alerts only when prices exceed user-defined thresholds,
3// enabling personalized trading notifications while filtering out irrelevant market movements.
4PNConfiguration.Builder tradingBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
5tradingBuilder.publishKey("myPublishKey");
6tradingBuilder.setFilterExpression("data.symbol LIKE \"CRYPTO*\" && data.price > meta.user[\"minPrice\"]");
7PubNub tradingPubNub = PubNub.create(tradingBuilder.build());
8
9// Risk management
10// This filter enforces trading limits and compliance rules by monitoring position sizes and account restrictions,
11// providing automated risk controls to prevent unauthorized or excessive trading activity.
12PNConfiguration.Builder riskBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
13riskBuilder.publishKey("myPublishKey");
14riskBuilder.setFilterExpression("data.position[\"size\"] <= meta.limits[\"maxPosition\"] && !(meta.restrictions CONTAINS \"dayTrading\")");
15PubNub riskPubNub = PubNub.create(riskBuilder.build());
show all 23 lines1// Trading signal filtering
2// This filter delivers cryptocurrency price alerts only when prices exceed user-defined thresholds,
3// enabling personalized trading notifications while filtering out irrelevant market movements.
4PNConfiguration tradingConfig = new PNConfiguration(new UserId("myUserId"));
5tradingConfig.SubscribeKey = "mySubscribeKey";
6tradingConfig.PublishKey = "myPublishKey";
7tradingConfig.FilterExpression = "data.symbol LIKE \"CRYPTO*\" && data.price > meta.user[\"minPrice\"]";
8Pubnub tradingPubNub = new Pubnub(tradingConfig);
9
10// Risk management
11// This filter enforces trading limits and compliance rules by monitoring position sizes and account restrictions,
12// providing automated risk controls to prevent unauthorized or excessive trading activity.
13PNConfiguration riskConfig = new PNConfiguration(new UserId("myUserId"));
14riskConfig.SubscribeKey = "mySubscribeKey";
15riskConfig.PublishKey = "myPublishKey";
show all 26 lines1# Trading signal filtering
2# This filter delivers cryptocurrency price alerts only when prices exceed user-defined thresholds,
3# enabling personalized trading notifications while filtering out irrelevant market movements.
4pnconfig.filter_expression = 'data.symbol LIKE "CRYPTO*" && data.price > meta.user["minPrice"]'
5
6# Risk management
7# This filter enforces trading limits and compliance rules by monitoring position sizes and account restrictions,
8# providing automated risk controls to prevent unauthorized or excessive trading activity.
9pnconfig.filter_expression = 'data.position["size"] <= meta.limits["maxPosition"] && !(meta.restrictions CONTAINS "dayTrading")'
10
11# Market event filtering
12# This filter identifies significant market movements by analyzing trade volume and price changes,
13# delivering alerts only for high-impact events that meet minimum transaction value and volatility criteria.
14pnconfig.filter_expression = '(data.volume * data.price) > meta.filters["minValue"] && data.changePercent > 5'
Best practices
- Filter design
- Expression construction
- Performance monitoring
- Design metadata with filtering in mind from the start
- Use specific field names rather than generic terms
- Include computed values to avoid complex arithmetic
- Flatten nested structures where possible for performance
- Keep data types consistent across similar fields
- Start simple; test equality before adding complexity
- Use parentheses to make operator precedence explicit
- Put selective conditions first in AND expressions
- Build complex filters incrementally
- Monitor filter impact on message throughput
- Prefer numeric comparisons over string operations when possible
- Cache filter expressions instead of rebuilding them
You can filter by a non-filterable value by adding the value to metadata or the payload and of the message, then filtering on it.
Publisher filtering
To filter by publisher, include publisher information in metadata:
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Publishing with publisher info in metadata
2await pubnub.publish({
3 channel: 'updates',
4 message: { text: 'Hello World' },
5 meta: {
6 publisher: pubnub.getUserId(), // Include publisher in metadata
7 region: 'San Francisco'
8 }
9});
10
11// Filter based on publisher metadata
12pubnub.setFilterExpression('meta.publisher != "' + pubnub.getUserId() + '"'); // Filter out own messages
1// Publishing with publisher info
2pubnub.publish(
3 channel: "updates",
4 message: ["text": "Hello World"],
5 meta: [
6 "publisher": pubnub.configuration.userId,
7 "region": "San Francisco"
8 ]
9)
10
11// Filter based on publisher metadata
12let filterConfig = PubNubConfiguration(
13 publishKey: "myPublishKey",
14 subscribeKey: "mySubscribeKey",
15 userId: "myUserId",
show all 18 lines1// Filter based on publisher metadata
2pubnub.filterExpression = [NSString stringWithFormat:@"meta.publisher != \"%@\"", [pubnub userID]];
3
4// Publishing with publisher info
5PNPublishRequest *request = [PNPublishRequest requestWithChannel:@"updates"];
6request.message = @{@"text": @"Hello World"};
7request.metadata = @{@"publisher": [pubnub userID], @"region": @"San Francisco"};
8[pubnub publishWithRequest:request completion:nil];
1// Publishing with publisher info
2Map<String, Object> metadata = new HashMap<>();
3metadata.put("publisher", pubNub.getConfiguration().getUserId().getValue());
4metadata.put("region", "San Francisco");
5
6pubNub.publish()
7 .channel("updates")
8 .message(Collections.singletonMap("text", "Hello World"))
9 .meta(metadata)
10 .sync();
11
12// Filter based on publisher metadata
13PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
14configBuilder.publishKey("myPublishKey");
15configBuilder.setFilterExpression("meta.publisher != \"" + "myUserId" + "\"");
show all 16 lines1// Publishing with publisher info
2var metadata = new Dictionary<string, object> {
3 {"publisher", pubnub.PNConfig.UserId},
4 {"region", "San Francisco"}
5};
6
7pubnub.Publish()
8 .Channel("updates")
9 .Message(new { text = "Hello World" })
10 .Meta(metadata)
11 .Execute();
12
13// Filter based on publisher metadata
14pnconfig.FilterExpression = $"meta.publisher != \"{pubnub.PNConfig.UserId}\"";
1# Filter based on publisher metadata
2pnconfig.filter_expression = f'meta.publisher != "{pubnub.config.user_id}"'
3
4# Publishing with publisher info
5pubnub.publish()
6 .channel("updates")
7 .message({"text": "Hello World"})
8 .meta({
9 "publisher": pubnub.config.user_id,
10 "region": "San Francisco"
11 })
12 .sync()
Message type filtering
To filter by the custom message type, include the message type in the message payload or metadata when you add the customMessageType
parameter during a publish.
Publish with type in payload
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Publish with type in payload
2const ALERT_TYPE = 'alert'; // pass custom message type value to publish and message payload
3
4// Filter by message type via message payload
5pubnub.setFilterExpression(`data.type == "${ALERT_TYPE}"`); // filter via payload
6
7// Publish with type in payload
8await pubnub.publish({
9 channel: 'alerts',
10 message: {
11 text: 'System Alert',
12 type: ALERT_TYPE // include type in payload for filtering
13 },
14 meta: {
15 priority: 'high'
show all 18 lines1let ALERT_TYPE = "alert"
2
3/// Create PubNub configuration with a filter expression to receive only messages
4/// where data.type property in the message payload matches ALERT_TYPE
5let config = PubNubConfiguration(
6 publishKey: "myPublishKey",
7 subscribeKey: "mySubscribeKey",
8 userId: "myUserId",
9 filterExpression: "data.type == '\(ALERT_TYPE)'"
10)
11
12let pubnub = PubNub(configuration: config)
13
14/// Publish a message with structured payload containing the type property for filtering.
15/// The 'type' field in the message payload enables server-side filtering by data.type.
show all 25 lines1// Publishing with type information in message payload
2NSString *ALERT_TYPE = @"alert"; // pass custom message type value to publish and message payload
3
4// Filter by type via data payload
5pubnub.filterExpression = [NSString stringWithFormat:@"data.type == \"%@\"", ALERT_TYPE]; // filter via payload
6
7// Publish with type in payload
8PNPublishRequest *request = [PNPublishRequest requestWithChannel:@"alerts"];
9request.message = @{@"text": @"System Alert", @"type": ALERT_TYPE}; // include type in payload for filtering
10request.metadata = @{@"priority": @"high"};
11[pubnub publishWithRequest:request completion:nil];
1// Publishing with type information in message payload
2final String ALERT_TYPE = "alert"; // pass custom message type value to publish and message payload
3
4// Configure filter expressions
5PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
6configBuilder.publishKey("myPublishKey");
7
8// Filter by type via data payload
9configBuilder.setFilterExpression(String.format("data.type == \"" + ALERT_TYPE + "\""); // filter via payload
10
11PubNub pubnub = PubNub.create(configBuilder.build());
12
13// Build the message payload
14Map<String, Object> message = new HashMap<>();
15message.put("text", "System Alert");
show all 27 lines1// Publish with type in payload
2const string ALERT_TYPE = "alert"; // pass custom message type value to publish and message payload
3
4// Filter by message type via message payload
5pnconfig.FilterExpression = $"data.type == \"{ALERT_TYPE}\""; // filter via payload
6
7var message = new { text = "System Alert", type = ALERT_TYPE }; // include type in payload for filtering
8var metadata = new Dictionary<string, object>() { { ALERT_TYPE ,"high" } };
9
10pubnub.Publish()
11 .Channel("alerts")
12 .Message(message)
13 .Meta(metadata)
14 .CustomMessageType(ALERT_TYPE)
15 .Execute();
1# Publish with type in payload
2ALERT_TYPE = "alert" # pass custom message type value to publish and message payload
3
4# Filter by message type via message payload
5pnconfig.filter_expression = f'data.type == "{ALERT_TYPE}"' # filter via payload
6
7pubnub.publish()
8 .channel("alerts")
9 .message({
10 "text": "System Alert",
11 "type": ALERT_TYPE # include type in payload for filtering
12 })
13 .meta({
14 "priority": "high"
15 })
show all 17 linesPublish with type in metadata
- JavaScript
- Swift
- Objective-C
- Java
- C#
- Python
1// Publish with type in metadata
2const ALERT_TYPE = 'alert'; // pass custom message type value to publish and message payload
3
4// Filter by message type in metadata
5pubnub.setFilterExpression(`meta.msgType == "${ALERT_TYPE}"`); // filter via metadata
6
7// Publishing with type information in metadata
8await pubnub.publish({
9 channel: 'alerts',
10 message: {
11 text: 'System Alert',
12 },
13 meta: {
14 msgType: ALERT_TYPE, // include type in metadata for filtering
15 priority: 'high'
show all 18 lines1let ALERT_TYPE = "alert"
2
3/// Create PubNub configuration with a filter expression to receive only messages
4/// where meta.msgType matches ALERT_TYPE defined above
5let config = PubNubConfiguration(
6 publishKey: "myPublishKey",
7 subscribeKey: "mySubscribeKey",
8 userId: "myUserId",
9 filterExpression: "meta.msgType == '\(ALERT_TYPE)'"
10)
11
12let pubnub = PubNub(configuration: config)
13
14/// Publish a message with custom message type and an extra metadata object.
15/// ALERT_TYPE is included in the meta: properties to enable server-side filtering.
show all 25 lines1// Publishing with type information in metadata
2static NSString * const ALERT_TYPE = @"alert"; // pass custom message type value to publish and metadata
3
4// Filter by type via metadata
5pubnub.filterExpression = [NSString stringWithFormat:@"meta.msgType == \"%@\"", ALERT_TYPE]; // filter via metadata
6
7// Publishing with type information in metadata
8PNPublishRequest *request = [PNPublishRequest requestWithChannel:@"alerts"];
9request.message = @{@"text": @"System Alert"};
10request.metadata = @{@"priority": @"high", @"msgType": ALERT_TYPE}; // include type in metadata for filtering
11[pubnub publishWithRequest:request completion:nil];
1// Publishing with type information in metadata
2final String ALERT_TYPE = "alert"; // pass custom message type value to publish and metadata
3
4// Configure filter expressions
5PNConfiguration.Builder configBuilder = PNConfiguration.builder(new UserId("myUserId"), "mySubscribeKey");
6configBuilder.publishKey("myPublishKey");
7
8// Filter by type via metadata
9configBuilder.setFilterExpression(String.format("meta.msgType == \"" + ALERT_TYPE + "\""); // filter via metadata
10
11PubNub pubnub = PubNub.create(configBuilder.build());
12
13// Build the message payload
14Map<String, Object> message = new HashMap<>();
15message.put("text", "System Alert");
show all 27 lines1// Publish with type in metadata
2const string ALERT_TYPE = "alert"; // pass custom message type value to publish and metadata
3
4// Filter by message type in metadata
5pnconfig.FilterExpression = $"meta.msgType == \"{ALERT_TYPE}\""; // filter via metadata
6
7// Publishing with type information in metadata
8var message = new { text = "System Alert" };
9var metadata = new Dictionary<string, object>() { { ALERT_TYPE, "high" } }; // include type in metadata for filtering
10
11pubnub.Publish()
12 .Channel("alerts")
13 .Message(message)
14 .Meta(metadata)
15 .CustomMessageType(ALERT_TYPE)
show all 16 lines1# Publish with type in metadata
2ALERT_TYPE = "alert" # pass custom message type value to publish and metadata
3
4# Filter by message type in metadata
5pnconfig.filter_expression = f'meta.msgType == "{ALERT_TYPE}"' # filter via metadata
6
7# Publishing with type information in metadata
8pubnub.publish()
9 .channel("alerts")
10 .message({
11 "text": "System Alert"
12 })
13 .meta({
14 "msgType": ALERT_TYPE, # include type in metadata for filtering
15 "priority": "high"
show all 18 linesPerformance optimization
Use these guidelines to keep filter evaluation fast and resource‑efficient at scale.
Filter efficiency guidelines
Efficiency | Technique | Example |
---|---|---|
Most efficient | Direct field comparisons | meta.priority == "high" |
Most efficient | Numeric operations | data.score > 100 |
Most efficient | Simple AND conditions | field1 == "value" && field2 > 5 |
Moderately efficient | Pattern matching | field LIKE "prefix*" |
Moderately efficient | Array/object access | meta.array[0] == "value" |
Moderately efficient | Arithmetic operations | meta.id % 10 == 0 |
Use sparingly | Complex arithmetic | (field1 + field2) * field3 > threshold |
Use sparingly | Long OR chains | Many || conditions |
Use sparingly | Nested patterns | Multiple LIKE/CONTAINS in one expression |
Metadata design for filtering
Structure your metadata to optimize filter performance:
1// Efficient metadata structure
2meta: {
3 priority: "high", // Direct string access
4 userTier: "premium", // Flattened user information
5 categoryFlags: "news,urgent", // Comma-separated for CONTAINS
6 computedScore: 85, // Pre-calculated values
7 permissions: { // Single-level nesting
8 read: "true",
9 write: "false"
10 }
11}
12
13// Less efficient structure
14meta: {
15 user: {
show all 23 linesTroubleshooting
Use these checks to diagnose and fix filter expression problems.
Common filter expression errors
Start with these frequent mistakes.
Syntax issues
1// INCORRECT: Boolean literal
2meta.active == true
3
4// CORRECT: String comparison
5meta.active == "true"
6
7// WRONG: Assignment operator
8meta.priority = "high"
9
10// CORRECT: Equality operator
11meta.priority == "high"
Field access issues
1// INCORRECT: Direct envelope field access
2publisher == "alice"
3uuid == "user123"
4
5// CORRECT: Include in metadata
6meta.publisher == "alice" // (must be included when publishing)
7meta.uuid == "user123" // (must be included when publishing)
8// Or
9data.publisher == "alice" // (must be included in message payload)
10data.uuid == "user123" // (must be included in message payload)
Object access issues
1// INCORRECT: Multi-level chaining
2meta.data["users"][0] == "alice"
3
4// CORRECT: Single-level access
5meta.users[0] == "alice"
Filter expression reference
This section lists supported operators and data types for subscribe filter expressions.
Complete operator support
Operator | Type | Description | Example |
---|---|---|---|
== | Comparison | Equality | meta.status == "active" |
!= | Comparison | Inequality | data.type != "debug" |
> | Comparison | Greater than | meta.level > 5 |
< | Comparison | Less than | data.score < 100 |
>= | Comparison | Greater or equal | meta.priority >= 3 |
<= | Comparison | Less or equal | data.size <= 1024 |
LIKE | Pattern | Wildcard matching | meta.title LIKE "news*" |
CONTAINS | Pattern | Substring search | data.tags CONTAINS "urgent" |
&& | Logical | AND | meta.active == "true" && data.score > 50 |
|| | Logical | OR | meta.priority == "high" || data.urgent == "true" |
! | Logical | NOT | !(data.type == "system") |
% | Arithmetic | Modulo | meta.userId % 10 == 0 |
+ | Arithmetic | Addition | meta.base + 5 > 20 |
- | Arithmetic | Subtraction | data.total - data.used < 10 |
* | Arithmetic | Multiplication | meta.rate * 100 > 50 |
/ | Arithmetic | Division | data.total / data.count > 5 |
[n] | Access | Array element | meta.tags[0] == "urgent" |
["key"] | Access | Object property | meta.user["role"] == "admin" |
Data type support
Data Type | Syntax | Example | Notes |
---|---|---|---|
String | "value" | meta.name == "Alice" | Always quote string values |
Number | 123 , 3.14 | data.score > 85 | No quotes for numeric values |
Boolean | "true" , "false" | meta.enabled == "true" | Use strings, not literals |
Array | [index] | meta.tags[0] | Zero-based indexing |
Object | ["key"] | meta.user["role"] | Use double quotes for keys |