1

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

让我在示例的帮助下更正确地解释它。

假设我有两个集合:

  1. 用户
  2. 接触

用户集合包含以下字段:

  1. 名字(字符串)
  2. 姓氏(字符串)
  3. isActive(布尔值)

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

  1. Contacter (User) 声明为 DBref 类型。
  2. 联系人(用户)声明为 DBRef 类型。
  3. 联系状态(字符串)

现在我想触发一个查询,它将获取所有联系人 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);
4

1 回答 1

2

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

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

$ref- 引用的集合

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

(实际上,$db如果引用是不同的数据库,则有第三个字段)

因此,使用 shell,您只能请求 contacter.$id(返回用户集合中的对象 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; 

}

将为您加载两个用户对象

于 2013-07-31T15:54:40.277 回答