查询mongodb dbref内部字段

时间:2013-07-31 14:34:14

标签: java mongodb dbref

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

让我在示例的帮助下更恰当地解释一下。

假设我有两个集合:

  1. 用户
  2. 联系
  3. 用户集包含以下字段:

    1. 名字(字符串)
    2. 姓氏(字符串)
    3. isActive(布尔)
    4. 联系人收藏包含以下字段:

      1. 联系人(用户)声明为DBref。
      2. 类型
      3. Contactee(User)声明为DBRef类型。
      4. ContactStatus(String)
      5. 现在我想触发一个查询,它将获取所有联系人 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 个答案:

答案 0 :(得分: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; 

}

将为您加载两个用户对象