몽구스 _id와 문자열 비교


197

다음과 같이 일부 데이터를 가져 와서 객체에 넣는 node.js 응용 프로그램이 있습니다.

var results = new Object();

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

저장된 ID를 기반으로 if / then을 수행 할 때 비교는 사실이 아닙니다.

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

두 ID의 console.log를 수행하면 정확히 일치합니다.

User id: 4fc67871349bb7bf6a000002 AnotherMongoDocument id: 4fc67871349bb7bf6a000002

나는 이것이 일종의 데이터 유형 문제라고 가정하지만 results.userId를 데이터 유형으로 변환하는 방법을 잘 모르겠습니다. 위의 비교가 사실이며 내 아웃소싱 뇌 (일명 Google)가 도울 수 없었습니다.

답변:


361

Mongoose는 사용자 정의 ObjectID 유형을 사용하는 mongodb-native 드라이버를 사용합니다. .equals()메소드 와 ObjectID를 비교할 수 있습니다 . 예를 들어 results.userId.equals(AnotherMongoDocument._id). 문자열 형식의 ObjectID toString()버전을 JSON 형식으로 저장하거나 쿠키를 저장하려는 경우 ObjectID 유형에도 메소드가 있습니다.

ObjectID = require("mongodb").ObjectID(mongodb-native 라이브러리 필요) 를 사용 results.userId하는 경우 로 유효한 식별자 인지 확인할 수 있습니다 results.userId instanceof ObjectID.

기타.



4
이미 사용하고 있다면 mongoose당신은 할 수 있습니다 만 require('mongoose').mongo.ObjectID당신은 추가 종속성을 나열 할 필요가 없습니다
JoshuaDavid

63

ObjectIDs는 객체이므로 ==참조를 비교하는 것과 비교하면됩니다 . 값을 비교하려면 다음 ObjectID.equals방법 을 사용해야합니다 .

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

17

객체 ID를 문자열로 변환하면 (toString () 메서드 사용) 작업이 수행됩니다.


8

허용되는 답변은 실제로 코드로 수행 할 수있는 작업을 제한합니다. 예를 들어 Object Idsequals 메서드를 사용하여 배열을 검색 할 수 없습니다 . 대신 항상 문자열로 캐스팅하고 키를 비교하는 것이 더 합리적입니다.

다음 indexOf()은 특정 ID에 대한 참조 배열 내에서 확인하는 데 사용해야 하는 경우에 대한 대답 예 입니다. 가정 query가정, 당신은 실행중인 쿼리 것은 someModel당신이 찾고있는 ID에 대한 몽고의 모델, 그리고 마지막으로 가정 results.idList당신이 개체 ID를 찾고있는 분야이다.

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
또는 한 줄짜리 :let exists = results.idList.filter(val => val.toString() === thisIsTheStringifiedIdWeAreLookingFor).length ? true : false
Zlatko

4
@ Zlatko 나는 새로운 구문의 큰 팬이 아니라 각자 자신의 팬입니다.
r3wt 2018 년

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

1
몇 년 후 @Zlatko, 그리고 추측. 나는 지금 당신의 버전을 선호합니다. 적절한 기여로 답변에 추가해도 괜찮습니까?
r3wt

1
진전의 대가 :) 물론 당신은 답을 사용할 수 있으며, 가능한 경우 대안이나 도움을 제공하는 것이 목적입니다.
Zlatko

6

위와 같이 문제를 해결하는 세 가지 방법을 찾았습니다.

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

0

나는 정확히 같은 문제에 직면 JSON.stringify()했으며 다음 과 같이 도움을 받아 문제를 간단히 해결했습니다 .

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

0

여기에 제안 된 세 가지 가능한 솔루션은 사용 사례가 다릅니다.

  1. 두 개의 mongoDocuments에서 ObjectID를 비교할 때 .equals 사용

    results.userId.equals (AnotherMongoDocument._id)

  2. ObjectID의 문자열 표현을 mongoDocument의 ObjectID와 비교할 때 .toString ()을 사용하십시오. 이처럼

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


세 번째 가능한 해결책은 무엇입니까?
Chris Catignani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.