2013-07-31 118 views
0

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

让我通过例子更好地解释它。

假设我有两个集合:

  1. 用户
  2. 联系

用户集合包含以下字段:

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

联系集合包含以下字段:

  1. 查询联系人(用户)声明为类型DBREF的。
  2. 联系人(用户)声明为DBRef类型。
  3. ContactStatus(字符串)

现在我想火的查询将获取所有其 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和 弹簧数据的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); 

回答

2

是的,你可以查询DbRef字段,但不是你正在做的方式。

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

$ref -the引用集合

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

(实际上是有第三个字段$db如果参考是不同的数据库)

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

如果您正在使用Java驱动程序,这两个查询联系人和联系者都表示为com.mongodb.DBRef其中有一个方法获取()使用弹簧数据的MongoDB检索DBObject(用户)

如果,您可能希望有类如:

class Contact { 

@DBRef 
User contacter; 

@DBRef 
User contactee; 

String contactStatus; 

} 

两个用户对象将被载入为你

+0

感谢重播@orid。是的,我使用的是spring-data-mongodb驱动程序,我的模型类与您所展示的相同。但我不明白你的这一行 - **但你可以在联系人上使用isActive,它不是为你预取的**请你再解释一下。 – mobizen

+0

对不起,错字。应该是**,但你不能**而不是**,但你可以**。修正了我的帖子 –