Morphia MongoDB检查空和非现有字段

时间:2015-05-01 09:26:14

标签: mongodb morphia

我是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字段?

3 个答案:

答案 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);