簡體   English   中英

查詢mongodb dbref內部字段

[英]Querying mongodb dbref inner field

我需要隱藏其isActive標志設置為false的所有用戶相關數據。 有許多集合我使用了DBRef類型的用戶集合(大約14個集合),每個集合包含超過1000萬條記錄。

讓我借助例子更恰當地解釋一下。

假設我有兩個集合:

  1. 用戶
  2. 聯系

用戶集包含以下字段:

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

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

  1. Contacter(用戶)聲明為DBref類型。
  2. Contactee(User)聲明為DBRef類型。
  3. ContactStatus(String)

現在我想觸發一個查詢,它將獲取ContactStatus = "Confirmed" && Contacter.isActive = true && Contactee.isActive = true所有聯系人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);

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

DbRef是一個小的子文檔,包含兩個字段:

$ref ref-引用的集合

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

(實際上,如果引用的是另一個db,則會有第三個字段$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; 

}

將為您加載兩個用戶對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM