2012-06-16 39 views
26

Tôi có một công cụ đơn giản để xây dựng bộ sưu tập tài liệu và sau đó tự động định dạng chúng để hiển thị EPUB hoặc LaTeX, được viết trên đầu trang của ExpressJS. Tôi đang sử dụng Coffeescript, nếu có vấn đề (tôi nghi ngờ nó).Mongoose: ObjectId So sánh không phù hợp

Sử dụng Mongoose, tôi đã điều sau đây:

DocumentSchema = new Schema 
    title:  String 

Offrefs = new Schema 
    ref:  { type: ObjectId } 
    isa:  String 

BinderSchema = new Schema 
    title:  String 
    contains: [Offrefs] 

Offrefs không xác định những gì nó đề cập đến vì bởi vì tôi muốn để có thể chứa một số chất kết dính trong chất kết dính khác, để tạo ra bộ sưu tập hợp lý: "Những dành cho máy in, "" Đây là thông tin dành cho máy in "" Đây là những trang web chỉ ", v.v. (Tôi đã loại bỏ tất cả các nội dung khác nhau.)

Thật không may, tôi đã truy vấn vào nơi để truy lục các đối tượng

(story._id == offref.ref) -> True 

Và cả hai thực sự trông giống nhau. Nhưng:

(binder._id == offref.ref) -> False 
(String(binder._id) == String(offref.ref)) -> True 

Và một so sánh hình ảnh của hai tham chiếu trong hai cuối cùng, họ số ID giống nhau, nhưng các ObjectId đối tượng không so sánh một cách chính xác.

Tôi không muốn phải thực hiện chuyển đổi chuỗi liên tục, đây là khả năng mạnh khi tôi chuyển đổi các đối tượng phức tạp này thành cây dữ liệu. Mối quan hệ cây là một con gấu trong bất kỳ DB nào; họ không nên khó khăn trong MongoDB.

Làm thế nào để bạn so sánh ObjectId trong MongoDB?

Trả lời

76

Một số thẳng == (hoặc ===) so sánh sẽ so sánh hai đối tượng theo tham chiếu, chứ không phải giá trị. Vì vậy, điều đó sẽ chỉ đánh giá đúng nếu cả hai tham chiếu cùng một ví dụ.

Thay vào đó, bạn nên sử dụng phương pháp equals của ObjectID để so sánh giá trị của họ:

story._id.equals(offref.ref) 

Như @bendytree ghi chú trong các ý kiến, nếu một trong hai giá trị có thể là null (và bạn muốn null để so sánh như bình đẳng), sau đó bạn có thể sử dụng sau đây thay vì:

String(story._id) === String(offref.ref) 
+8

Yay, các tính năng không có giấy tờ. – peterjwest

+0

Vì vậy, điều này không giống như mongoose.Schema.Types.ObjectID? Tài liệu của họ ngụ ý rằng nó chỉ có phương pháp 'tự động': http://mongoosejs.com/docs/api.html#schema-objectid-js – peterjwest

+1

@peterjwest Phải, 'mongoose.Schema.Types.ObjectId' thực sự là chỉ để sử dụng làm siêu dữ liệu kiểu trường trong định nghĩa lược đồ. – JohnnyHK

1

này đi hơi xa hơn là câu hỏi ban đầu, nhưng tôi đã phát hiện ra rằng Equals phương pháp ObjectId sẽ trả về false trong một số trường hợp so sánh chuỗi sẽ trở lại đúng ngay cả khi các giá trị không phải là null. Ví dụ:

var compare1 = invitationOwningUser.toString() === linkedOwningUser.toString(); 
var compare2 = invitationOwningUser.equals(linkedOwningUser); 
var compare3 = String(invitationOwningUser) === String(linkedOwningUser); 
logger.debug("compare1: " + compare1 + "; " + "compare2: " + compare2 + "; " + "compare3: " + compare3); 

Output:

compare1: true; compare2: false; compare3: true 

Điều này xảy ra khi invitationOwningUser (một ObjectId) xuất thân từ một Bộ sưu tập tạo bằng một sơ đồ Mongoose, và linkedOwningUser (cũng là một ObjectId) xuất thân từ một Bộ sưu tập không được tạo ra sử dụng Mongoose (chỉ là các phương thức MongoDB thông thường).

Đây là tài liệu chứa invitationOwningUser (lĩnh vực owningUser):

{ 
    "_id" : ObjectId("5782faec1f3b568d58d09518"), 
    "owningUser" : ObjectId("5781a5685a06e69b158763ea"), 
    "capabilities" : [ 
     "Read", 
     "Update" 
    ], 
    "redeemed" : true, 
    "expiry" : ISODate("2016-07-12T01:45:18.017Z"), 
    "__v" : 0 
} 

Đây là tài liệu chứa linkedOwningUser (lĩnh vực owningUser):

{ 
    "_id" : ObjectId("05fb8257c95d538d58be7a89"), 
    "linked" : [ 
     { 
      "owningUser" : ObjectId("5781a5685a06e69b158763ea"), 
      "capabilities" : [ 
       "Read", 
       "Update" 
      ] 
     } 
    ] 
} 

Vì vậy, như một điểm mấu chốt đối với tôi , Tôi sẽ sử dụng kỹ thuật so sánh chuỗi để so sánh ObjectID, chứ không phải phương thức .equals.

+0

Điều này có vẻ như là một vấn đề quan trọng. Bạn có biết tại sao Mongoose không thấy chúng giống nhau không? Tôi đoán đó là 'if (! Buffer.isBuffer (other))' trong 'MongooseBuffer.mixin.equals', có vẻ là một tối ưu hóa để lưu các nội dung quét. Tôi lo lắng bây giờ! Tôi chỉ chuyển đổi .toString của tôi thành .equals. (nhưng tôi chỉ sử dụng mongoose == mongoose, vì vậy tôi đoán nó không phải là một rủi ro). – scipilot

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