milvus-io / milvus-sdk-java

Java SDK for Milvus.
https://milvus.io
Apache License 2.0
391 stars 165 forks source link

针对不存在的id进行筛选删除时,固定返回删除条数为1 #1182

Open Yiling1f opened 21 hours ago

Yiling1f commented 21 hours ago

描述 在Milvus SDK v2.4.x (Java)中,当表达式针对id进行筛选时,无论数据有没有被真实删除,都返回被删除条数为1。例如:试图删除id为1111的数据,但该数据在milvus数据库中不存在,删除操作也返回了被删除条数为1.

重现步骤

ConnectParam.Builder builder = ConnectParam.newBuilder()
    .withHost("xx.xxx.xx.xx")
    .withPort(19530);
MilvusClient milvusClient = new MilvusServiceClient(builder.build());

DeleteParam deleteRequest = DeleteParam.newBuilder()
    .withCollectionName("test")
    .withExpr("id == 1")
    .build();

R<MutationResult> result = milvusClient.delete(deleteRequest);
System.out.println("Deleted rows: " + result.getData().getDeleteCnt());

此处的id为任意数据库中不存在的值,执行后观察到返回的删除条数为1。

期待回复!

yhmo commented 14 hours ago

目前后台的逻辑是分两种情况处理的:

  1. id > 100 这种表达式,后台是把表里所有的id都查看了一遍,找出了 > 100的那些id,所以能够准确知道有多少个被删除。
  2. id == xxx 或者 id in [xxx, xxx] 这种表达式,后台为了省掉这个查询的时间,直接通过解析表达式来获得个数,id==xxx直接返回1,id in [xxx, xxx]是直接返回数组里的个数。然后真正的删除操作会异步执行。