[node.js] 몽구스 _id와 문자열 비교

다음과 같이 일부 데이터를 가져 와서 객체에 넣는 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)가 도울 수 없었습니다.



답변

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.

기타.


답변

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

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


답변

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


답변

허용되는 답변은 실제로 코드로 수행 할 수있는 작업을 제한합니다. 예를 들어 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. AnotherMongoDocument._id.toString()
  2. JSON.stringify(AnotherMongoDocument._id)
  3. results.userId.equals(AnotherMongoDocument._id)

답변

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

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


답변

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

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

    results.userId.equals (AnotherMongoDocument._id)

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

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