MongoDB / Morphia - 删除对象行为不正常,我错过了什么?

MongoDB / Morphia - Delete object not behaving properly, what did I miss?

我有这样的删除查询:

Query<E> query = datastore.createQuery(entityClass);
query.field(fieldName).equals(fieldValue);
return datastore.findAndDelete(query);

所以目的是 select 一个基于唯一字段的对象并将其删除。我在集合中有四个对象,每个对象对于我查询的字段都有不同的值。但是当我执行 findAndDelete 时,返回了一个随机对象,而不是符合条件的对象。

我一遍又一遍地执行此操作,每次返回另一个随机对象,直到所有对象都被删除,然后它 returns null.

我实际上是在执行这个:

Query<Entity> query = datastore.createQuery(Entity.class);
query.field("uniqueHash").equals("SDFSDGRTGEFQDFRYDGSWE");
return datastore.findAndDelete(query);

当我调试时,我发现集合中的所有对象实际上对 uniqueHash 字段具有不同的值

我错过了什么??我没有正确构建此查询吗?

**更新:**这是删除操作前后的完整数据:

> db.CustomObject.find().pretty()
{
        "_id" : ObjectId("54a590546c66e6672cfff53a"),
        "className" : "com.test.CustomObject",
        "tokenHash" : "SG6o3mXOOBfGHYlhA2S2p52O1/GXOUZvF6kY5X3ZyvA="
}
{
        "_id" : ObjectId("54a590546c66e6672cfff53b"),
        "className" : "com.test.CustomObject",
        "tokenHash" : "RotU72A4E9Oh8qC+cCX4Y+MdIShuuaDX03jQQXZVG34="
}
{
        "_id" : ObjectId("54a590546c66e6672cfff53c"),
        "className" : "com.test.CustomObject",
        "tokenHash" : "sYLKPRlddqc3I+ORVwCzYjzeU+ErBveQNvHYYyCsi7o="
}
{
        "_id" : ObjectId("54a590546c66e6672cfff53d"),
        "className" : "com.test.CustomObject",
        "tokenHash" : "eVltEP/ptPqw6WrMDCCzd+rcoVrShcMr9fF3CENLj8Q="
}

然后我执行:

Query<CustomObject> query = datastore.createQuery(CustomObject.class);
query.field("tokenHash").equals("RotU72A4E9Oh8qC+cCX4Y+MdIShuuaDX03jQQXZVG34=");
return datastore.findAndDelete(query);

结果是删除了一个对象,但不是我希望的对象:

> db.CustomObject.find().pretty()
{
        "_id" : ObjectId("54a590546c66e6672cfff53b"),
        "className" : "com.test.CustomObject",
        "tokenHash" : "RotU72A4E9Oh8qC+cCX4Y+MdIShuuaDX03jQQXZVG34="
}
{
        "_id" : ObjectId("54a590546c66e6672cfff53c"),
        "className" : "com.test.CustomObject",
        "tokenHash" : "sYLKPRlddqc3I+ORVwCzYjzeU+ErBveQNvHYYyCsi7o="
}
{
        "_id" : ObjectId("54a590546c66e6672cfff53d"),
        "className" : "com.test.CustomObject",
        "tokenHash" : "eVltEP/ptPqw6WrMDCCzd+rcoVrShcMr9fF3CENLj8Q="
}

谢谢!

您需要使用Field class' equal方法,而不是Object class的equals方法。

query.field("tokenHash").equal("RotU72A4E9Oh8qC+cCX4Y+MdIShuuaDX03jQQXZVG34=");

equalsObjectclass中的一个方法,用于比较两个Object中的值。它 return 只是对或错。因此下面的语句

query.field("tokenHash").equals("RotU72A4E9Oh8qC+cCX4Y+MdIShuuaDX03jQQXZVG34=");

会 return false,而不实际构建 query 对象,而 Field class 的 equal 方法确实如此。