2011-07-27 97 views
7

解決方案可能正在盯着我,但我沒有找到任何運氣。我的問題是我需要找到包含指定DBRef的所有文檔。這裏的要搜索的集合的結構:通過DBRefs數組查找文檔

{ 
    "_id" : ObjectId("4e2d4892580fd602eb000003"), 
    "date_added" : ISODate("2011-07-25T11:42:26.395Z"), 
    "date_updated" : ISODate("2011-07-25T11:43:09.870Z"), 
    ... 
    "a_list_of_dbrefs" : [ 
     { 
      "$ref" : "somecollection" 
      "$id" : "4e2d48ab580fd602eb000004" 
     } 
    ], 
    ... 
    "name" : "some name" 
} 

我需要能夠檢索根據DBREF一組文檔出現在a_list_of_dbrefs(一些a_list_of_dbrefs可能不包含DBREFS,別人可能含有1,和其他人可能包含多於1個)。

這是如何完成的?

回答

2

我建議傾銷DBRef s,只是簡單地存儲引用文檔的_id,假設您知道被引用集合的名稱。

絕對沒有辦法在服務器端(在一個步驟中)在MongoDB上「解析」DBRef的數組,並要求您遍歷客戶端上的數組並逐個解析每個文檔。相反,如果您存儲僅包含引用的_id的數組,則可以檢索該數組,然後使用$in查詢將其全部提取出來。

所以你的文件可能會改變看起來像這樣:

{ 
    "_id" : ObjectId("4e2d4892580fd602eb000003"), 
    "date_added" : ISODate("2011-07-25T11:42:26.395Z"), 
    "date_updated" : ISODate("2011-07-25T11:43:09.870Z"), 
    ... 
    "references": [ 
     ObjectId(123), ObjectId(234), ObjectId(567), ObjectId(891) 
    ], 
    ... 
    "name" : "some name" 
} 

然後,您可以使用references字段的內容查詢的MongoDB:

db.somecollection.find({"_id": {"$in": references}}) 
+0

我不喜歡,這是因爲使用DBREF意味着文檔可以使用MongoTemplate自動序列化到他們的Java同行,例如原因。否則,序列化必須自定義 – IcedDante

15

試試這個,它爲我工作:

db.<your collection>.find({"a_list_of_dbrefs.$id": ObjectID("4e2d48ab580fd602eb000004")}) 

您還可以檢索所有具有參考集合的元素:

db.<your collection>.find({"a_list_of_dbrefs.$ref": "somecollection"}) 
+0

我認爲這應該被標記爲正確的答案... – martin