我是Morphia和MongoDB的新手。有没有办法检查使用Morphia我的数据库中的某个字段不是null
并且也存在。例如,来自数据库中用户集合的用户的以下记录:
{ "_id" : ObjectId("51398e6e30044a944cc23e2e"),
"age" : 21 ,
"createdDate" : ISODate("2013-03-08T07:08:30.168Z"),
"name" : "Some name" }
如何使用Morphia查询检查字段"createdDate"
是否为空并且是否存在。
修改 我正在寻找Morphia的解决方案。到目前为止,我已经想出了这个:
query.and(query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null));
从文档中,我了解到Morphia不存储空字段或空字段。因此notEqual(null)
的理由。
编辑2:从答案中我可以看到问题需要更多解释。我无法修改createdDate
。详细说明:上面的例子不如我的实际问题复杂。我真正的问题有敏感字段,我无法修改。另外,为了使事情复杂化,我无法控制模型,否则我可以使用其中一个答案中提出的@PrePersist
。
当我无法控制模型并且不允许修改字段时,有没有办法检查null和non existing字段?
答案 0 :(得分:3)
从documentation开始,Morphia不存储Null / Empty值(默认情况下),因此查询
query.and(
query.criteria("createdDate").exists(),
query.criteria("createdDate").notEqual(null)
);
将无效,因为您似乎无法查询null,但可以查询特定值。
但是,由于您只能查询特定值,因此可以设计一种解决方法,您可以使用模型中从未使用的日期值更新createdDate
字段。例如,如果使用0初始化Date对象,则将其设置为纪元的开头,1970年1月1日00:00:00 UTC。你得到的时间是局部时间偏移。如果您的更新仅涉及修改mongo shell中的匹配元素就足够了,因此它看起来与此类似:
db.users.update(
{"createdDate": null },
{ "$set": {"createdDate": new Date(0)} }
)
然后,您可以使用 Fluent Interface 查询该特定值:
Query<User> query = mongoDataStore
.find(User.class)
.field("createdDate").exists()
.field("createdDate").hasThisOne(new Date(0));
定义模型以包含更新createdDate字段的prePersist方法会更简单。该方法使用@PrePersist
注释进行标记,以便在保存之前在订单上设置日期。 @PostPersist
,@PreLoad
和@PostLoad
存在等效注释。
@Entity(value="users", noClassNameStored = true)
public class User {
// Properties
private Date createdDate;
...
// Getters and setters
..
@PrePersist
public void prePersist() {
this.createdDate = (createdDate == null) ? new Date() : createdDate;
}
}
答案 1 :(得分:0)
在mongo中,您可以使用此查询:
db.MyCollection.find({"myField" : {$ne : null}})
此查询将返回具有“myField”字段且值不为null的对象。
答案 2 :(得分:0)
首次创建Morphia实例时,在调用morphia.mapPackage()
之前执行此操作:
morphia.getMapper().getOptions().setStoreNulls(true);
让Morphia存储空值。
无论如何,您应该能够使用以下方法查询非空值:
query.field("createdDate").notEqual(null);