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=");
equals
是Object
class中的一个方法,用于比较两个Object中的值。它 return 只是对或错。因此下面的语句
query.field("tokenHash").equals("RotU72A4E9Oh8qC+cCX4Y+MdIShuuaDX03jQQXZVG34=");
会 return false
,而不实际构建 query
对象,而 Field
class 的 equal
方法确实如此。
我有这样的删除查询:
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=");
equals
是Object
class中的一个方法,用于比较两个Object中的值。它 return 只是对或错。因此下面的语句
query.field("tokenHash").equals("RotU72A4E9Oh8qC+cCX4Y+MdIShuuaDX03jQQXZVG34=");
会 return false
,而不实际构建 query
对象,而 Field
class 的 equal
方法确实如此。