So sánh mongoose _id và chuỗi


197

Tôi có một ứng dụng node.js lấy một số dữ liệu và dán nó vào một đối tượng, như thế này:

var results = new Object();

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

Khi tôi thực hiện if / then dựa trên ID được lưu trữ đó, so sánh không bao giờ đúng:

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

Khi tôi thực hiện console.log của hai id, chúng khớp chính xác:

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

Tôi giả sử đây là một loại vấn đề về kiểu dữ liệu, nhưng tôi không chắc cách chuyển đổi results.userId thành một kiểu dữ liệu sẽ dẫn đến sự so sánh ở trên là đúng và bộ não thuê ngoài của tôi (còn gọi là Google) đã không thể giúp đỡ.

Câu trả lời:


359

Mongoose sử dụng trình điều khiển gốc mongodb, sử dụng loại ObjectID tùy chỉnh. Bạn có thể so sánh ObjectID với .equals()phương thức. Với ví dụ của bạn , results.userId.equals(AnotherMongoDocument._id). Kiểu ObjectID cũng có một toString()phương thức, nếu bạn muốn lưu trữ một phiên bản được xâu chuỗi của ObjectID ở định dạng JSON hoặc cookie.

Nếu bạn sử dụng ObjectID = require("mongodb").ObjectID(yêu cầu thư viện gốc mongodb), bạn có thể kiểm tra xem có phải results.userIdlà định danh hợp lệ không results.userId instanceof ObjectID.

Vân vân.



4
Nếu bạn đã sử dụng, mongoosebạn có thể chỉ cần require('mongoose').mongo.ObjectIDliệt kê bất kỳ phụ thuộc bổ sung nào
JoshuaDavid

62

ObjectIDs là các đối tượng vì vậy nếu bạn chỉ so sánh chúng với ==bạn đang so sánh các tham chiếu của chúng. Nếu bạn muốn so sánh các giá trị của chúng, bạn cần sử dụng ObjectID.equalsphương thức:

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

17

chuyển đổi id đối tượng thành chuỗi (sử dụng phương thức toString ()) sẽ thực hiện công việc.


8

Các câu trả lời được chấp nhận thực sự giới hạn những gì bạn có thể làm với mã của mình. Ví dụ, bạn sẽ không thể tìm kiếm một mảng Object Idsbằng cách sử dụng phương thức equals. Thay vào đó, sẽ có ý nghĩa hơn khi luôn truyền vào chuỗi và so sánh các phím.

Đây là một câu trả lời ví dụ trong trường hợp nếu bạn cần sử dụng indexOf()để kiểm tra trong một loạt các tham chiếu cho một id cụ thể. giả sử querylà một truy vấn bạn đang thực hiện, giả sử someModellà một mô hình mongo cho id bạn đang tìm kiếm và cuối cùng giả sử results.idListlà trường bạn đang tìm id đối tượng của bạn.

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
hoặc một lớp lót:let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Zlatko

4
@Zlatko Tôi không phải là một fan hâm mộ lớn của cú pháp mới mà là của riêng anh ấy.
r3wt

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

1
@Zlatko tất cả những năm sau đó, và đoán xem. Tôi thích phiên bản của bạn để khai thác ngay bây giờ. nếu tôi thêm nó vào câu trả lời của tôi với sự ghi nhận thích hợp?
r3wt

1
Giá của sự tiến bộ :) Tất nhiên bạn có thể sử dụng câu trả lời, mục đích của nó là cung cấp một sự thay thế hoặc trợ giúp nếu có thể.
Zlatko

6

Theo như trên, tôi tìm thấy ba cách để giải quyết vấn đề.

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

0

Tôi đã đối mặt chính xác cùng một vấn đề và tôi chỉ đơn giản là giải quyết vấn đề với sự giúp đỡ JSON.stringify()như sau: -

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

0

Ba giải pháp có thể được đề xuất ở đây có các trường hợp sử dụng khác nhau.

  1. Sử dụng .equals khi so sánh ObjectID trên hai mongoDocument như thế này

    results.userId.equals (AnotherMongoDocument._id)

  2. Sử dụng .toString () khi so sánh biểu diễn chuỗi của ObjectID với ObjectID của mongoDocument. như thế này

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


Giải pháp khả thi thứ ba là gì?
Chris Catignani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.