Skip to content

Commit a2c9600

Browse files
committed
fix: allow None vector in milvus updates
Signed-off-by: lyang24 <[email protected]>
1 parent 97cbff7 commit a2c9600

File tree

2 files changed

+53
-4
lines changed

2 files changed

+53
-4
lines changed

mem0/vector_stores/milvus.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,18 @@ def update(self, vector_id=None, vector=None, payload=None):
178178
179179
Args:
180180
vector_id (str): ID of the vector to update.
181-
vector (List[float], optional): Updated vector.
181+
vector (List[float], optional): Updated vector. If None, the existing vector will be preserved.
182182
payload (Dict, optional): Updated payload.
183183
"""
184+
# If vector is None, fetch the existing vector to preserve it
185+
if vector is None:
186+
existing_data = self.client.get(collection_name=self.collection_name, ids=vector_id)
187+
if not existing_data:
188+
raise ValueError(f"Vector with ID {vector_id} not found")
189+
vector = existing_data[0].get("vectors")
190+
if vector is None:
191+
raise ValueError(f"Could not retrieve existing vector for ID {vector_id}")
192+
184193
schema = {"id": vector_id, "vectors": vector, "metadata": payload}
185194
self.client.upsert(collection_name=self.collection_name, data=schema)
186195

tests/vector_stores/test_milvus.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -157,18 +157,58 @@ def test_update_uses_upsert(self, milvus_db, mock_milvus_client):
157157
vector_id = "test_id"
158158
vector = [0.1] * 1536
159159
payload = {"user_id": "alice", "data": "Updated memory"}
160-
160+
161161
milvus_db.update(vector_id=vector_id, vector=vector, payload=payload)
162-
162+
163163
# Verify upsert was called (not delete+insert)
164164
mock_milvus_client.upsert.assert_called_once()
165-
165+
166166
call_args = mock_milvus_client.upsert.call_args
167167
assert call_args[1]['collection_name'] == "test_collection"
168168
assert call_args[1]['data']['id'] == vector_id
169169
assert call_args[1]['data']['vectors'] == vector
170170
assert call_args[1]['data']['metadata'] == payload
171171

172+
def test_update_with_vector_none(self, milvus_db, mock_milvus_client):
173+
"""Test that update with vector=None fetches and preserves existing vector."""
174+
vector_id = "test_id"
175+
existing_vector = [0.5] * 1536
176+
payload = {"user_id": "alice", "data": "Updated metadata only"}
177+
178+
# Mock the get call to return existing vector
179+
mock_milvus_client.get.return_value = [
180+
{"id": vector_id, "vectors": existing_vector, "metadata": {"user_id": "alice", "data": "Old data"}}
181+
]
182+
183+
# Update with vector=None should fetch existing vector
184+
milvus_db.update(vector_id=vector_id, vector=None, payload=payload)
185+
186+
# Verify get was called to fetch existing vector
187+
mock_milvus_client.get.assert_called_once_with(
188+
collection_name="test_collection",
189+
ids=vector_id
190+
)
191+
192+
# Verify upsert was called with the existing vector
193+
mock_milvus_client.upsert.assert_called_once()
194+
call_args = mock_milvus_client.upsert.call_args
195+
assert call_args[1]['collection_name'] == "test_collection"
196+
assert call_args[1]['data']['id'] == vector_id
197+
assert call_args[1]['data']['vectors'] == existing_vector # Should use existing vector
198+
assert call_args[1]['data']['metadata'] == payload
199+
200+
def test_update_with_vector_none_raises_error_if_not_found(self, milvus_db, mock_milvus_client):
201+
"""Test that update with vector=None raises error if vector not found."""
202+
vector_id = "nonexistent_id"
203+
payload = {"user_id": "alice"}
204+
205+
# Mock the get call to return empty list
206+
mock_milvus_client.get.return_value = []
207+
208+
# Should raise ValueError
209+
with pytest.raises(ValueError, match=f"Vector with ID {vector_id} not found"):
210+
milvus_db.update(vector_id=vector_id, vector=None, payload=payload)
211+
172212
def test_delete(self, milvus_db, mock_milvus_client):
173213
"""Test vector deletion."""
174214
vector_id = "test_id"

0 commit comments

Comments
 (0)