首页 文章

查询mongodb dbref内部字段

提问于
浏览
0

我需要隐藏其isActive标志设置为false的所有用户相关数据 . 有许多集合我使用了DBRef类型的用户集合(大约14个集合),每个集合包含超过1000万条记录 .

让我借助例子更恰当地解释一下 .

假设我有两个集合:

  • 用户

  • 联系

用户集包含以下字段:

  • 名字(字符串)

  • 姓氏(String)

  • isActive(布尔)

联系人集合包含以下字段:

  • Contacter(User)声明为DBref类型 .

  • Contactee(User)声明为DBRef类型 .

  • ContactStatus(String)

现在我要触发一个查询,该查询将获取其所有联系人 ContactStatus = "Confirmed" && Contacter.isActive = true && Contactee.isActive = true

就mongodb而言,查询将是这样的:

db.Contacts.find({"ContactStatus" : "Confirmed", "Contacter.isActive" : true, "Contactee.isActive" : true});

但是当我在mongo shell中运行此查询时,它总是返回零记录 .

所以这里的问题是1)是否可以在DBRef的内部字段上触发查询? 2)如果没有,那我该怎么做呢 .

注意 - 在此阶段,我无法修改数据模型 . 在“in”查询的帮助下,我可以做到这一点 . 但它最终会在我需要隐藏该用户的地方增加一次往返 .

目前我使用的是mongodb-2.4.5和Spring-Data-MongoDB-1.2.3 jar

到目前为止我的代码是这样的 -

Criteria criteria = new Criteria();
criteria = criteria.where(Contact.CONTACT_REQUEST_STATUS).is(ContactRequestStatusEnum.ACCEPTED);
criteria = criteria.and(Contact.CONTACTER + "." + User.ACTIVE).is(Boolean.TRUE);
criteria = criteria.and(Contact.CONTACTEE + "." + User.ACTIVE).is(Boolean.TRUE);

Query q = new Query(criteria);
List<Contact> contacts = Contacts.find(q, Contact.class);

1 回答

  • 2

    是的,您可以查询DbRef字段,但不能查询您的方式 .

    DbRef是一个小的子文档,包含两个字段:

    $ref -引用的集合

    $id - 引用的集合中文档的_id值

    (实际上有第三个字段 $db ,如果引用的是另一个db)

    所以,使用shell你只能要求contacter . $ id(返回用户集合中的Object id)或$ ref,但是你不能查询诸如contract.isActive之类的东西,因为这是用户的一个字段,而不是Ref,shell不会获取用户 .

    如果您使用的是java驱动程序,则Contacter和Contactee都表示为 com.mongodb.DBRef ,其中有一个方法fetch()来检索 DBObject (用户)

    如果使用spring-data-mongodb,您可能希望拥有如下类:

    class Contact {
    
    @DBRef
    User contacter; 
    
    @DBRef
    User contactee;
    
    String contactStatus; 
    
    }
    

    将为您加载两个用户对象

相关问题