2011-07-27 25 views
7

Giải pháp có lẽ đang nhìn chằm chằm vào mặt tôi, nhưng tôi không có may mắn khi tìm thấy nó. Vấn đề của tôi là tôi cần phải tìm tất cả các tài liệu có chứa DBRef được chỉ định. Dưới đây là cấu trúc của bộ sưu tập được tìm kiếm:Tìm tài liệu theo mảng 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" 
} 

tôi cần để có thể lấy một tập hợp các tài liệu dựa trên một DBRef xuất hiện trong a_list_of_dbrefs (một số a_list_of_dbrefs có thể chứa không DBRefs, những người khác có thể chứa 1, và những người khác có thể chứa nhiều hơn 1).

Làm thế nào là thực hiện?

Trả lời

2

Tôi khuyên bạn nên bán phá giá DBRef s để chỉ lưu trữ _id tài liệu được tham chiếu giả sử bạn biết tên của bộ sưu tập đang được tham chiếu. Hoàn toàn không có cách nào để "giải quyết" một mảng DBRef từ phía máy chủ (trong một bước) trên MongoDB và yêu cầu bạn lặp qua mảng trên máy khách và giải quyết riêng từng tài liệu.

Ngược lại, nếu bạn lưu trữ một mảng chỉ là tham chiếu _id bạn có thể truy xuất mảng đó và sau đó sử dụng truy vấn $in để tìm nạp tất cả.

Vì vậy, tài liệu của bạn có thể thay đổi để giống như thế này:

{ 
    "_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" 
} 

Sau đó bạn có thể truy vấn MongoDB sử dụng các nội dung của references lĩnh vực:

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

Lý do tôi không thích điều này là do việc sử dụng DBRef có nghĩa là tài liệu có thể tự động được tuần tự hóa vào các đối tác Java của chúng bằng cách sử dụng MongoTemplate, ví dụ. Nếu không serialization phải được tùy chỉnh – IcedDante

15

Hãy thử thế này, nó làm việc cho tôi:

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

Bạn cũng có thể truy xuất tất cả các yếu tố có yêu cầu thu thập:

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

Tôi nghĩ rằng điều này nên được đánh dấu là câu trả lời đúng ... – martin

Các vấn đề liên quan