Mongoose _id ve dizelerini karşılaştırma


197

Bazı veri çeker ve böyle bir nesneye yapışır bir node.js uygulama var:

var results = new Object();

User.findOne(query, function(err, u) {
    results.userId = u._id;
}

Saklanan kimliğe dayalı bir if / then yaptığımda karşılaştırma asla doğru değildir:

if (results.userId == AnotherMongoDocument._id) {
    console.log('This is never true');
}

İki id's bir console.log yaptığımda, tam olarak eşleşir:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

Bunun bir tür veri tipi sorunu olduğunu varsayıyorum, ancak nasıl sonuç dönüştürüleceğinden emin değilim.userId, yukarıdaki karşılaştırmanın doğru olmasına neden olacak bir veri tipine ve dış kaynaklı beynime (Google) yardımcı olamadı.

Yanıtlar:


361

Mongoose, özel ObjectID türünü kullanan mongodb-native sürücüsünü kullanır. ObjectID'leri .equals()yöntemle karşılaştırabilirsiniz . Örneğinizle results.userId.equals(AnotherMongoDocument._id),. ObjectID'nin toString()dize edilmiş bir sürümünü JSON biçiminde veya bir çerezde saklamak istiyorsanız, ObjectID türünün de bir yöntemi vardır .

Eğer kullanırsanız ObjectID = require("mongodb").ObjectIDolmadığını kontrol edebilirsiniz (mongodb-yerli kütüphane gerektirir) results.userIdile geçerli bir tanımlayıcı olan results.userId instanceof ObjectID.

Vb.



4
Zaten kullanıyorsanız mongoose, require('mongoose').mongo.ObjectIDek bağımlılıkları listelemeniz gerekmez
JoshuaDavid

63

ObjectIDs nesnelerdir, bu yüzden onları sadece karşılaştırırsanız ==referanslarını karşılaştırırsınız. Değerlerini karşılaştırmak istiyorsanız, ObjectID.equalsyöntemi kullanmanız gerekir :

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}

17

nesne kimliğini dizeye dönüştürmek (toString () yöntemini kullanarak) işi yapar.


8

Kabul edilen cevaplar kodunuzla yapabileceklerinizi gerçekten sınırlar. Örneğin, bir diziyi arayamazsınız.Object Ids , equals yöntemini kullanarak arayamazsınız. Bunun yerine, her zaman dizeye yayın yapmak ve anahtarları karşılaştırmak daha mantıklı olacaktır.

indexOf()Belirli bir kimlik için bir dizi referansı kontrol etmek için kullanmanız gerekirse, örnek bir cevap aşağıda verilmiştir . varsayalım querybir sorgu olduğunu varsayalım, varsayalım someModelaradığınız kimliği için bir mongo modeli olduğunu ve son olarak varsayalım results.idListiçinde nesne kimliği aradığınız alan olduğunu varsayalım .

query.exec(function(err,results){
   var array = results.idList.map(function(v){ return v.toString(); });
   var exists = array.indexOf(someModel._id.toString()) >= 0;
   console.log(exists);
});

1
ya da bir astar:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Zlatko

4
@Zlatko Yeni sözdiziminin büyük bir hayranı değil, her birinin kendi hayranıyım.
r3wt

2
@Zlatko const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) or const exists = results.idList.some(val => val.equals(someModel._id))
axanpi

1
@ Bunca yıl sonra Zlatko ve tahmin et ne oldu. Şimdi sürümünün benim olmasını tercih ediyorum. Eğer uygun atıf ile cevabımı eklerseniz sakıncası var mı?
r3wt

1
İlerleme fiyatı :) Tabii ki cevabı kullanabilirsiniz, amacı mümkünse bir alternatif veya yardım sağlamaktı.
Zlatko

6

Yukarıdakilere göre, sorunu çözmek için üç yol buldum.

  1. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)

0

Ben tam olarak aynı sorunla karşı karşıya ve ben sadece JSON.stringify()aşağıdaki gibi yardımıyla sorunu çözdü : -

if (JSON.stringify(results.userId) === JSON.stringify(AnotherMongoDocument._id)) {
        console.log('This is never true');
}

0

Burada önerilen üç olası çözümün farklı kullanım durumları vardır.

  1. Bunun gibi iki mongoDocuments üzerinde ObjectID karşılaştırırken .equals kullanın

    results.userId.equals (AnotherMongoDocument._id)

  2. ObjectID dizesinin temsilini bir mongoDocument nesnesi ile karşılaştırırken .toString () kullanın. bunun gibi

    results.userId === AnotherMongoDocument._id.toString ()


Üçüncü olası çözüm nedir?
Chris Catignani
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.