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.

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



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)) {
    ...
}

17

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


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

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)

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

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


Apa solusi ketiga yang mungkin?
Chris Catignani
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.