2012-06-16 16 views
26

Ben belgelerin bina koleksiyonları için basit bir araca sahip ve daha sonra otomatik olarak ExpressJS üstünde yazılı, EPUB veya LaTeX oluşturma için bunları biçimlendirme başarısız. Coffeescript kullanıyorum, eğer önemliyse (şüpheliyim). Mongoose kullanmaGelincik: Nesne Karşılaştırmalar tutarsız

, şu var: "Bunlar: Offrefs o kadar çünkü mantıklı koleksiyonlar oluşturmak için, diğer bağlayıcı bazı bağlayıcılar içermesi mümkün istiyorum çünkü neyi anlatır belirtmez

DocumentSchema = new Schema 
    title:  String 

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

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

yazıcı için, "" Bunlar, web için, "" Bunlar sadece web vardır, "vb. (Ben tüm çeşitli şeyler dışarı sıyrıldı ettik.)

Ne yazık ki, geri çağrılan sorgulara girdim nesneleri

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

Ve ikisi de aynı görünüyor. Ama:

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

Ve son iki iki referansın görsel karşılaştırma, bunlar aynı kimlik numarası fakat ObjectId nesneler doğru karşılaştırın yoktur. İstemediğim

Ben verilerin ağaçlara bu karmaşık nesneleri dönüştürme ediyorum kuvvetli olasılıkları olan sürekli dize dönüşümleri yapmak zorunda. Ağaç ilişkileri herhangi bir DB'de bir ayıdır; MongoDB'de zor olmamalılar.

nasıl MongoDB içinde Nesne Kimliği karşılaştırmalar yapıyorlar?

cevap

76

bir düz == (veya ===) Karşılaştırma referans değere göre değil, iki nesne karşılaştıracaktır. Yani, bu ikisi de aynı örneğe hem başvurursa doğruyu değerlendirecektir. Her iki değer null olabilir, eğer yorumlardaki @bendytree notları gibi

story._id.equals(offref.ref) 

(ve boş değerlere eşit karşılaştırmak istiyorum:

Bunun yerine, bunların değerlerini karşılaştırmak için ObjectID arasında equals yöntemi kullanılarak yapılmalıdır), o zaman yerine aşağıdaki kullanabilirsiniz:

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

Yay, belgesiz özellikler. – peterjwest

+0

Yani bu mongoose.Schema.Types.ObjectID ile aynı değil mi? http://mongoosejs.com/docs/api.html#schema-objectid-js – peterjwest

+1

Hakkı @peterjwest, 'mongoose.Schema.Types.ObjectId' gerçekten: Onların belgeler sadece yöntem 'otomatik' sahip olduğunu ima Şema tanımlarında alan tipi meta veri olarak kullanmak için. – JohnnyHK

1

Bu biraz orijinal sorulan soruya ötesine geçer, ama bir dize karşılaştırma dönecektir nerede NesneKimliği en hakkındaki .equals yöntemi bazı durumlarda yanlış dönecektir bulduk Değerler boş olmadığında bile doğrudur. Örnek:

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); 

Çıktı: invitationOwningUser (bir NesneKimliği) bir Gelincik şema kullanılarak oluşturulan bir Koleksiyonu'ndan geldi ve linkedOwningUser (aynı zamanda bir NesneKimliği) kullanılarak oluşturulan bir Koleksiyonu'ndan geldiğinde bu oluştu

compare1: true; compare2: false; compare3: true 

Mongoose (sadece düzenli MongoDB yöntemleri).İşte

invitationOwningUser içeren belge (owningUser alanı) geçerli: Benim için bir alt çizgi olarak

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

Yani,: Burada

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

linkedOwningUser içeren belge (owningUser alanı) olduğunu , .equals yöntemini değil, ObjectID'leri karşılaştırmak için dize karşılaştırma tekniğini kullanacağım.

+0

Bu önemli bir sorun gibi görünüyor. Mongoose'un onları neden aynı görmediğini biliyor musun? Sanırım, '' MongooseBuffer.mixin.equals''da '' (! Buffer.isBuffer (other)) 'içeriğinin taranmasını kaydetmek için bir optimizasyon gibi görünüyor. Şimdi endişeliyim! .toString'imi .equals'a dönüştürdüm. (ama sadece mongoose == mongoose kullanıyorum, bu yüzden bir risk değil). – scipilot