2012-06-29 57 views
16

Tôi có một câu hỏi liên quan đến MongoDB với dữ liệu mùa xuân. Tôi có các lớp miền này:MongoDB đối tượng nhúng không có ID (giá trị null)

@Document 
public class Deal { 
    @Id 
    private ObjectId _id; 
    private Location location; 
    private User user; 
    private String description; 
    private String title; 
    private String price; 
    private boolean approved; 
    private Date expirationDate; 
    private Date publishedDate; 
} 

@Document 
public class Location { 
    @Id 
    private ObjectId _id; 
    private Double latitude; 
    private Double longitude; 
    private String country; 
    private String street; 
    private String zip; 
} 

@Document 
public class User { 
    @Id 
    private ObjectId _id; 
    private String email; 
    private String password; 
    private String profile_image_url; 
    private Collection<Deal> deals = new ArrayList<Deal>(); 
} 

Với những miền này tôi có thể thành công CRUD. Chỉ có một vấn đề. Khi lưu User với Deals, các giao dịch và Location get _id được đặt thành null khi lưu chúng vào MongoDB. Tại sao không MongoDB tạo id duy nhất cho các đối tượng nhúng?

Kết quả sau khi tiết kiệm một tài khoản với một thỏa thuận:

{ "_id" : ObjectId("4fed0591d17011868cf9c982"), 
    "_class" : "User", 
    "email" : "[email protected]", 
    "password" : "mimi", 
    "deals" : [ 
    { "_id" : null, 
     "location" : { "_id" : null, 
     "latitude" : 2.22, 
     "longitude" : 3.23445, 
     "country" : "Denmark", 
     "street" : "Denmark road 77", 
     "zip" : "2933" }, 
     "description" : "The new Nexus 7 Tablet. A 7 inch tablet from Google.", 
     "title" : "Nexus 7", 
     "price" : "1300", 
     "approved" : false, 
     "expirationDate" : Date(1343512800000), 
     "publishedDate" : Date(1340933521374) } ] } 

Như bạn có thể nhìn thấy từ kết quả, Xử lý và vị trí ID được thiết lập để NULL.

+0

ID xác định tài liệu gốc, không phải tài liệu phụ. Không có lý do tại sao bạn muốn tự động tạo một id cho một tài liệu lồng nhau vì MongoDB chỉ có thể lấy các tài liệu cấp cao nhất. Những gì bạn thực sự cần id lồng nhau cho? –

+0

Tôi chỉ cần tìm kiếm giao dịch chứ không phải là Người dùng. Bây giờ tôi phải tìm kiếm từ người dùng và sau đó vòng lặp đã ném mọi thỏa thuận trong người dùng lập trình. – Millad

+0

Id không liên quan gì đến những gì bạn có thể tìm kiếm. Thật tuyệt khi tìm kiếm '{'deals.price': {$ gt: 1000}}'. Tuy nhiên, truy vấn này sẽ trả về một đối tượng 'User' mà bạn phải tự tay rút ra' Deal' từ đó. Đây là giới hạn MongoDB, không có gì ngụ ý bởi Dữ liệu Mùa xuân. –

Trả lời

4

Một _id không được đặt trên các tài liệu con theo mặc định chỉ trên các tài liệu gốc.

Bạn sẽ cần phải xác định _id cho các tài liệu phụ của bạn khi chèn và cập nhật.

+0

Anh ấy có nên làm điều đó cho tôi không? Làm thế nào tôi có thể làm điều đó? Tôi có nên chèn mọi tài liệu một mình và họ đặt chúng lại với nhau không? Đây là cách tôi chèn: mongoOperation.insert (deal); – Millad

+0

MongoDB sẽ không làm điều này cho bạn nhưng bây giờ tôi có một cái nhìn thứ hai có lẽ Driver của bạn nên ... bạn đang sử dụng Morphia? – Sammaye

+0

cảm ơn câu trả lời. Tôi đang sử dụng Spring Data và mongo-java-driver. Khi tôi tìm kiếm các giao dịch, tôi nhận được một đối tượng User. Tôi không thể tìm kiếm bằng cách sử dụng Deals tôi phải đi ném người dùng và sau đó truy vấn lập trình trong User cho giao dịch. – Millad

29

MongoDB CRUD hoạt động (insert, update, find, remove) tất cả các hoạt động trên các tài liệu cấp cao nhất dành riêng - mặc dù tất nhiên bạn có thể lọc theo các lĩnh vực trong các văn bản nhúng. Tài liệu được nhúng luôn được trả về trong tài liệu gốc.

Trường _id là trường bắt buộc của tài liệu gốc và thường không cần thiết hoặc có trong tài liệu được nhúng. Nếu bạn yêu cầu một mã định danh duy nhất, bạn chắc chắn có thể tạo ra chúng, và bạn có thể sử dụng trường _id để lưu trữ chúng nếu điều đó thuận tiện cho mã của bạn hoặc mô hình tâm thần của bạn; thông thường hơn, chúng được đặt tên theo những gì chúng đại diện (ví dụ: "tên người dùng", "otherSystemKey", v.v.). Cả bản thân MongoDB cũng không phải bất kỳ trình điều khiển nào sẽ tự động điền vào trường _id ngoại trừ tài liệu cấp cao nhất.

Cụ thể trong Java, nếu bạn muốn tạo ra giá trị ObjectId cho trường _id trong các văn bản nhúng, bạn có thể làm như vậy với:

someEmbeddedDoc._id = new ObjectId(); 
+0

Cảm ơn bạn đã xóa thông tin này. Vì vậy, nếu tôi muốn chỉ liệt kê các giao dịch, tôi phải tách riêng hoặc di chuyển tài liệu User khỏi tài liệu Giao dịch để Deal là một tài liệu riêng và Người dùng là tài liệu được tách riêng và sau đó truy vấn. – Millad

+0

Hoặc là điều chỉnh hoặc điều chỉnh mã của bạn để hoạt động với mô hình dữ liệu hiện có. Nếu bạn thường xuyên thao túng giao dịch hoặc nếu giao dịch được liên kết với nhiều người dùng thì việc chuẩn hóa mô hình dữ liệu có thể hợp lý. – dcrosta

2

Mongo không tạo ra hoặc cần _id s trên các tài liệu nhúng. Bạn có thể thêm một trường _id nếu bạn muốn - Tôi đã thực hiện nó.

@Document 
public class Location { 
    @Id 
    private ObjectId _id; 

    public Location() { 
     this._id = ObjectId.get(); 
    } 
} 

@Document 
public class User { 
    @Id 
    private ObjectId _id; 

    public User() { 
     this._id = ObjectId.get(); 
    } 
} 

Điều này phù hợp với tôi.

4

Trong ngữ cảnh của một kiến ​​trúc REST, nó làm cho mọi cảm giác rằng các tài liệu lồng nhau có các Id riêng của chúng.

  1. Việc triển khai bền vững phải độc lập với việc trình bày tài nguyên. Là một người tiêu dùng API, tôi không quan tâm nếu bạn đang sử dụng mongo hoặc mysql. Nếu bạn là một tài liệu làm tổ không có id trong mongo, hãy thử tưởng tượng cách thay đổi lớp persistence thành một cơ sở dữ liệu quan hệ. Bây giờ làm cùng một bài tập đã suy nghĩ trước với một cách tiếp cận độc lập thực hiện. Mô hình hóa các tài liệu lồng nhau trong một db quan hệ, tài liệu gốc và lồng nhau sẽ là các thực thể/bảng khác nhau với các id riêng của chúng. Gốc có thể có mối quan hệ một đến nhiều với tài liệu lồng nhau.
  2. Tôi có thể cần phải truy cập tài liệu lồng nhau trực tiếp thay vì tuần tự.I có thể không cần id duy nhất tuyệt đối, như id được tạo bởi mongo, nhưng tôi vẫn cần một số nhận dạng duy nhất cục bộ. Đây là, duy nhất trong tài liệu gốc.

Có lập luận cho biết về nhu cầu id trong tài liệu lồng nhau @dcrosta đã đưa ra câu trả lời đúng về cách điền trường _id ở mongo.

Hy vọng điều này sẽ hữu ích.

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