2013-07-31 112 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

對不起,錯字。應該是**,但你不能**而不是**,但你可以**。修正了我的帖子 –