我需要隐藏所有isActive标志设置为false的用户相关数据。在许多集合中,我使用了DBRef类型的用户集合(大约14个集合),每个集合包含超过1000万条记录。
让我举例更恰当地解释一下。
假设我有两个集合:
- 用户
- 联系人
用户集合包含以下字段:
- 名字(字符串)
- 姓氏(字符串)
- isActive(布尔值)
联系人集合包含以下字段:
- Contacter(User)声明为DBref类型
- 被联系人(用户)声明为DBRef类型
- ContactStatus(字符串)
现在我想启动一个查询,该查询将获取所有联系人ContactStatus = "Confirmed" && Contacter.isActive = true && Contactee.isActive = true
就mongodb而言,查询将是这样的:
db.Contacts.find({"ContactStatus" : "Confirmed", "Contacter.isActive" : true, "Contactee.isActive" : true});
但是当我在mongoshell中运行这个查询时,它总是返回一个零记录。
所以这里的问题是1) 是否可以对DBRef的内部字段发起查询?2) 如果没有,那么我该如何做到这一点。
注意-在这个阶段,我无法修改我的数据模型。在"in"查询的帮助下,我可以实现这一点。但它最终会增加我需要隐藏用户的往返行程。
目前我正在使用mongodb-2.4.5和Spring-Data-MongoDB-1.2.3罐
到目前为止,我的代码是这样的-
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);
是的,您可以查询DbRef字段,但不能按照您的方式进行查询。
DbRef是一个小型子文档,包含两个字段:
$ref
-引用的集合
$id
-引用集合中文档的_id值
(如果引用的是不同的db,则实际上存在第三个字段$db
)
因此,使用shell,您只能请求联系人$id(返回users集合中的Object id)或$ref,但不能查询contract.isActive之类的内容,因为这是用户的字段,而不是ref,shell不会获取用户。
如果您使用的是java驱动程序,Contacter和Contactee都表示为com.mongodb.DBRef
,它有一个方法fetch()来检索DBObject
(用户)
如果使用springdatamongodb,您可能希望有这样的类:
class Contact {
@DBRef
User contacter;
@DBRef
User contactee;
String contactStatus;
}
两个用户对象都将为您加载