Membandingkan _id dan string luwak

197

Saya memiliki aplikasi node.js yang menarik beberapa data dan menempelkannya ke objek, seperti ini:

var results = new Object();

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

Ketika saya melakukan if / then berdasarkan pada ID yang disimpan itu, perbandingannya tidak pernah benar:

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

Ketika saya melakukan console.log dari kedua id itu, keduanya sama persis:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

Saya berasumsi ini adalah semacam masalah tipe data, tapi saya tidak yakin bagaimana mengkonversi hasil. PenggunaId ke tipe data yang akan mengakibatkan perbandingan di atas menjadi benar dan otak saya yang di-outsource (alias Google) tidak dapat membantu.

menepuk
sumber

Jawaban:

360

Mongoose menggunakan driver mongodb-asli, yang menggunakan tipe ObjectID kustom. Anda dapat membandingkan ObjectIDs dengan .equals()metode ini. Dengan contoh Anda results.userId.equals(AnotherMongoDocument._id),. Tipe ObjectID juga memiliki toString()metode, jika Anda ingin menyimpan versi ObjectID dalam format JSON, atau cookie.

Jika Anda menggunakan ObjectID = require("mongodb").ObjectID(memerlukan pustaka mongodb-asli), Anda dapat memeriksa apakah results.userIdpengidentifikasi yang valid dengan results.userId instanceof ObjectID.

Dll

cjohn
sumber
13
Documents untuk .equals(): mongodb.github.io/node-mongodb-native/api-bson-generated/…
Anthony Panozzo
4
Jika Anda sudah menggunakan, mongooseAnda bisa saja require('mongoose').mongo.ObjectIDsehingga Anda tidak perlu membuat daftar dependensi tambahan
JoshuaDavid
63

ObjectIDs adalah objek jadi jika Anda hanya membandingkannya dengan ==Anda membandingkan referensi mereka. Jika Anda ingin membandingkan nilainya, Anda perlu menggunakan ObjectID.equalsmetode ini:

if (results.userId.equals(AnotherMongoDocument._id)) {
    ...
}
JohnnyHK
sumber
17

mengubah id objek menjadi string (menggunakan metode toString ()) akan melakukan pekerjaan itu.

Dila Gurung
sumber
8

Jawaban yang diterima benar-benar membatasi apa yang dapat Anda lakukan dengan kode Anda. Misalnya, Anda tidak akan dapat mencari array Object Idsdengan menggunakan metode equals. Sebagai gantinya, akan lebih masuk akal untuk selalu menggunakan string dan membandingkan kunci.

Berikut adalah contoh jawaban jika Anda perlu menggunakan indexOf()untuk memeriksa dalam array referensi untuk id tertentu. menganggap queryadalah permintaan yang Anda jalankan, menganggap someModeladalah model mongo untuk id yang Anda cari, dan akhirnya menganggap results.idListbidang yang Anda cari id objek Anda.

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);
});
r3wt
sumber
1
atau satu-liner:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Zlatko
4
@ Zlatko saya bukan penggemar sintaks baru tetapi untuk masing-masing sendiri.
r3wt
2
@Zlatko const exists = results.idList.some(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor) atau const exists = results.idList.some(val => val.equals(someModel._id))
axanpi
1
@ Zlatko bertahun-tahun kemudian, dan coba tebak. Saya lebih suka versi Anda daripada versi saya sekarang. keberatan jika saya menambahkannya ke jawaban saya dengan atribusi yang tepat?
r3wt
1
Harga kemajuan :) Tentu saja Anda dapat menggunakan jawabannya, tujuannya adalah untuk memberikan alternatif atau bantuan jika memungkinkan.
Zlatko
6

Menurut hal di atas, saya menemukan tiga cara untuk menyelesaikan masalah.

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

Saya menghadapi masalah yang sama persis dan saya hanya menyelesaikan masalah dengan bantuan JSON.stringify()sebagai berikut: -

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

Tiga kemungkinan solusi yang disarankan di sini memiliki berbagai kasus penggunaan.

  1. Gunakan .equals saat membandingkan ObjectID pada dua mongoDokumen seperti ini

    results.userId.equals (AnotherMongoDocument._id)

  2. Gunakan .toString () saat membandingkan representasi string dari ObjectID ke ObjectID dari mongoDocument. seperti ini

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

Ayah-Kerajaan
sumber
Apa solusi ketiga yang mungkin?
Chris Catignani