[MONGODB] 몽구스 : ObjectId가 비교가 일관성 실패
MONGODB몽구스 : ObjectId가 비교가 일관성 실패
나는 문서의 컬렉션을 구축하고 자동으로 ExpressJS 위에 기록 된 EPUB 또는 LaTeX의 렌더링, 그들을 포맷에 대한 간단한 도구를 가지고있다. 그 문제는 (나는 그것을 의심) 경우 나, 커피 스크립트를 사용하고 있습니다.
몽구스 사용하여, 나는 다음이있다 :
DocumentSchema = new Schema
title: String
Offrefs = new Schema
ref: { type: ObjectId }
isa: String
BinderSchema = new Schema
title: String
contains: [Offrefs]
Offrefs는 내가 논리적 컬렉션을 만들려면 다른 바인더에 약간의 바인더를 포함 할 수 있기를 원하기 때문에 때문에을 말한다을 지정하지 않습니다 "이 프린터위한", "다음은 EPUB위한", "이들은 단지 웹 있습니다 "등 (나는 모든 기타 물건을 밖으로 제거했습니다.)
불행히도, 난 쿼리로 실행 한 경우, 검색된 개체에 대한
(story._id == offref.ref) -> True
그리고 두 사람은 실제로 같은 모습 않습니다. 그러나:
(binder._id == offref.ref) -> False
(String(binder._id) == String(offref.ref)) -> True
그리고 마지막 두에 두 개의 참조를 시각적으로 비교, 그들은 동일한 ID 번호, 그러나 ObjectId가 객체가 제대로 비교하지 않습니다.
나는 데이터의 나무로 이러한 복잡한 객체로 변환하고있어 강력한 possiblity가되는, 지속적으로 문자열 변환을 할 필요가 싶지 않아요. 트리 관계는 DB에있는 곰이다; 그들은 MongoDB의 어려운해서는 안됩니다.
어떻게하여 MongoDB에서 ObjectId가 비교합니까?
해결법
-
==============================
1.직선 == (또는 ===) 비교 기준이 아닌 값으로 두 객체를 비교한다. 그에만 true로 평가합니다 그래서 그들은 둘 참조 매우 동일한 인스턴스 경우.
직선 == (또는 ===) 비교 기준이 아닌 값으로 두 객체를 비교한다. 그에만 true로 평가합니다 그래서 그들은 둘 참조 매우 동일한 인스턴스 경우.
대신, 그들의 값을 비교 OBJECTID의 equals 메소드를 사용한다 :
story._id.equals(offref.ref)
(당신이 널 (null)이 같은 것으로 비교하려는 등) 중 값이 null이 될 수 있다면 코멘트에 @bendytree 노트로서, 당신은 대신 다음을 사용할 수 있습니다 :
String(story._id) === String(offref.ref)
-
==============================
2.이것은 원래 질문을하지만, 내가 OBJECTID의의 .equals 방법은 값이 null이 아닌 경우 문자열 비교가 참도를 반환합니다 경우에 false를 돌려줍니다 것으로 나타났습니다 약간 넘는다. 예:
이것은 원래 질문을하지만, 내가 OBJECTID의의 .equals 방법은 값이 null이 아닌 경우 문자열 비교가 참도를 반환합니다 경우에 false를 돌려줍니다 것으로 나타났습니다 약간 넘는다. 예:
var compare1 = invitationOwningUser.toString() === linkedOwningUser.toString(); var compare2 = invitationOwningUser.equals(linkedOwningUser); var compare3 = String(invitationOwningUser) === String(linkedOwningUser); logger.debug("compare1: " + compare1 + "; " + "compare2: " + compare2 + "; " + "compare3: " + compare3);
산출:
compare1: true; compare2: false; compare3: true
컬렉션은 몽구스 스키마를 사용하여 만든에서 invitationOwningUser (AN OBJECTID)이 왔을 때이 발생하고, linkedOwningUser (또한 OBJECTID는) 몽구스 (그냥 평범한 MongoDB의 방법)을 사용하여 생성되지 않은 컬렉션에서왔다.
여기 invitationOwningUser합니다 (owningUser 필드)를 포함하는 문서이다 :
{ "_id" : ObjectId("5782faec1f3b568d58d09518"), "owningUser" : ObjectId("5781a5685a06e69b158763ea"), "capabilities" : [ "Read", "Update" ], "redeemed" : true, "expiry" : ISODate("2016-07-12T01:45:18.017Z"), "__v" : 0 }
여기 linkedOwningUser합니다 (owningUser 필드)를 포함하는 문서이다 :
{ "_id" : ObjectId("05fb8257c95d538d58be7a89"), "linked" : [ { "owningUser" : ObjectId("5781a5685a06e69b158763ea"), "capabilities" : [ "Read", "Update" ] } ] }
그래서, 나를 위해 결론으로, 나는 OBJECTID의 아닌 .equals 방법을 비교하는 문자열 비교 기술을 사용하여 수 있습니다.
from https://stackoverflow.com/questions/11060213/mongoose-objectid-comparisons-fail-inconsistently by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] 몽구스 독특한 자동 증가 필드 만들기 (0) | 2019.12.18 |
---|---|
[MONGODB] 그것은 정수로하여 MongoDB의 _id 유형을 변경하는 것이 나쁜가요? (0) | 2019.12.18 |
[MONGODB] 정확한 배열 매치을 찾을 순서는 중요하지 않습니다 MongoDB를 (0) | 2019.12.18 |
[MONGODB] 어떻게 내 개체의 유효성을 검사 봄 - 데이터 - MongoDB를 얻을 수 있습니까? (0) | 2019.12.18 |
[MONGODB] MongoDB를 & Robomongo : 연결할 수 없습니다 (인증) (0) | 2019.12.18 |