web-gelistirme-sc.com

Mongoose _id ve dizgilerin karşılaştırılması

Bazı verileri çeken ve bir nesneye yapıştıran bir node.js uygulaması var:

var results = new Object();

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

Bir if/sonra bu kayıtlı kimliği temel alarak yaptığımda, karşılaştırma asla doğru değildir:

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

İki kimliği bir console.log yaptığımda, bunlar tam olarak eşleşiyor:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

Bunun bir tür veri türü sorunu olduğunu farz ediyorum, ancak results.userId'nin yukarıdaki karşılaştırmanın doğru olmasına ve dış kaynaklı beynimin (aka Google) yardımcı olamamasına neden olacak bir veri türüne nasıl dönüştürüleceğinden emin değilim.

168
pat

Mongoose, özel ObjectID türünü kullanan mongodb-native sürücüsünü kullanır. ObjectID'leri .equals() yöntemiyle karşılaştırabilirsiniz. Örneğinizle, results.userId.equals(AnotherMongoDocument._id). ObjectID türünün JSON biçiminde dizilmiş bir sürümünü veya bir çerez saklamak istiyorsanız, ObjectID türü ayrıca bir toString() yöntemine sahiptir.

ObjectID = require("mongodb").ObjectID kullanıyorsanız (mongodb-native kütüphanesini gerektirir) results.userId öğesinin results.userId instanceof ObjectID ile geçerli bir tanımlayıcı olup olmadığını kontrol edebilirsiniz.

Vb.

305
cjohn

ObjectIDs nesnelerdir, bu yüzden onları _==_ ile karşılaştırırsanız referanslarını karşılaştırıyorsunuzdur. Değerlerini karşılaştırmak istiyorsanız, _ObjectID.equals_ yöntemini kullanmanız gerekir:

_if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}
_
56
JohnnyHK

nesne kimliğini string'e dönüştürmek (toString () metodunu kullanarak) işi yapar.

15
Dila Gurung

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

Belirli bir kimliği için bir referanslar dizisini kontrol etmek için indexOf() kullanmanız gerekirse, örnek bir cevap. query uygulamasının çalıştığı bir sorgu olduğunu varsayalım, someModel, aradığınız kimliği için bir mongo modeli olduğunu ve son olarak results.idList, nesne kimliğinizde 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);
});
8
r3wt

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)
2
joy

Ben de aynı problemle karşılaştım ve sorunu şu şekilde JSON.stringify() yardımıyla çözdüm: -

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