Metadata Filters
vectlite supports MongoDB-style metadata filtering on search queries.
Metadata Types
Records can store rich metadata values:
str/stringint/numberfloat/numberbool/booleanNone/nulllist/arraydict/object
Comparison Operators
| Operator | Description |
|---|---|
$eq | Equal to (default when using direct value) |
$ne | Not equal to |
$gt | Greater than |
$gte | Greater than or equal to |
$lt | Less than |
$lte | Less than or equal to |
# Implicit $eq
results = db.search(query, k=10, filter={"source": "blog"})
# Explicit operators
results = db.search(query, k=10, filter={"price": {"$gte": 10, "$lt": 100}})
const results = db.search(query, { k: 10, filter: { price: { $gte: 10, $lt: 100 } } })
Set Operators
| Operator | Description |
|---|---|
$in | Value is in the given list |
$nin | Value is not in the given list |
$contains | Array field contains the value |
$exists | Field exists (true) or does not exist (false) |
results = db.search(query, k=10, filter={
"category": {"$in": ["docs", "blog"]},
"tags": {"$contains": "python"},
"deprecated": {"$exists": False},
})
Logical Operators
| Operator | Description |
|---|---|
$and | All conditions must match |
$or | At least one condition must match |
$not | Negates a condition |
results = db.search(query, k=10, filter={
"$or": [
{"source": "docs"},
{"priority": {"$gte": 5}},
]
})
Nested Access
Use dot notation to access nested fields:
results = db.search(query, k=10, filter={
"author.name": "Alice",
"metadata.tags": {"$contains": "python"},
})
Array Operators
| Operator | Description |
|---|---|
$elemMatch | Array element matches a condition |
$size | Array has exactly N elements |
results = db.search(query, k=10, filter={
"reviews": {"$elemMatch": {"$gte": 4}},
"tags": {"$size": 3},
})