diff --git a/langchain_postgres/vectorstores.py b/langchain_postgres/vectorstores.py index 89b78fb..20259f4 100644 --- a/langchain_postgres/vectorstores.py +++ b/langchain_postgres/vectorstores.py @@ -701,9 +701,15 @@ def _handle_field_filter( queried_field = self.EmbeddingStore.cmetadata[field].astext if operator in {"$in"}: - return queried_field.in_([str(val) for val in filter_value]) + return func.jsonb_exists_any( + self.EmbeddingStore.cmetadata[field], + filter_value + ) elif operator in {"$nin"}: - return ~queried_field.in_([str(val) for val in filter_value]) + return ~func.jsonb_exists_any( + self.EmbeddingStore.cmetadata[field], + filter_value + ) elif operator in {"$like"}: return queried_field.like(filter_value) elif operator in {"$ilike"}: diff --git a/tests/unit_tests/fixtures/filtering_test_cases.py b/tests/unit_tests/fixtures/filtering_test_cases.py index 514a10f..090a832 100644 --- a/tests/unit_tests/fixtures/filtering_test_cases.py +++ b/tests/unit_tests/fixtures/filtering_test_cases.py @@ -203,11 +203,31 @@ {"name": {"$in": ["adam", "bob"]}}, [1, 2], ), + ( + {"tags": {"$in": ["c", "d"]}}, + [2, 3], + ), + ( + {"tags": {"$in": ["b", "d"]}}, + [1, 2, 3], + ), # Test nin ( {"name": {"$nin": ["adam", "bob"]}}, [3], ), + ( + {"tags": {"$nin": ["c", "d"]}}, + [1], + ), + ( + {"tags": {"$nin": ["d"]}}, + [1, 2], + ), + ( + {"tags": {"$nin": ["e", "f"]}}, + [1, 2, 3], + ), ] TYPE_5_FILTERING_TEST_CASES = [