2012-06-16 23 views
26

문서 모음을 만들고 ExpressJS 위에 작성된 EPUB 또는 LaTeX 렌더링을 위해 자동으로 서식을 지정하는 간단한 도구가 있습니다. 그 점이 중요하다면 저는 Coffeescript를 사용하고 있습니다. 몽구스를 사용몽구스 : ObjectId 비교가 일관성없이 실패합니다.

, 나는 다음과 같은있다 : "이 : Offrefs 그것으로 인해 내가 논리적 컬렉션을 만들려면 다른 바인더에 약간의 바인더를 포함 할 수 있기를 원하기 때문에를 의미한다 무엇을 지정하지 않습니다

DocumentSchema = new Schema 
    title:  String 

Offrefs = new Schema 
    ref:  { type: ObjectId } 
    isa:  String 

BinderSchema = new Schema 
    title:  String 
    contains: [Offrefs] 

프린터 용입니다. ","이것들은 epub 용 ","이것들은 웹 전용 "등입니다 (모든 잡티를 모두 제거했습니다.)

불행히도, 나는 검색된 객체

(story._id == offref.ref) -> True 

두 사람은 실제로 동일하게 보입니다. 그러나 :

(binder._id == offref.ref) -> False 
(String(binder._id) == String(offref.ref)) -> True 

그리고 마지막 두에 두 개의 참조를 시각적으로 비교, 그들은 는 동일한 ID 번호 있지만 ObjectId 개체가 제대로 비교하지 않습니다.

문자열 변환을 끊임없이 수행하고 싶지는 않습니다. 이러한 복잡한 개체를 데이터 트리로 변환 할 때 강력한 가능성이 있습니다. 트리 관계는 모든 DB의 곰입니다. MongoDB에서는 어렵지 않아야합니다.

MongoDB에서 ObjectId 비교를 어떻게합니까?

답변

76

스트레이트 == (또는 ===) 비교는 값이 아닌 참조로 두 객체를 비교합니다. 두 인스턴스가 모두 동일한 인스턴스를 참조하는 경우에만 true로 평가됩니다. 두 값이 null이 될 수 있다면, 코멘트에 @bendytree 노트로

story._id.equals(offref.ref) 

(당신은 널 (null)이 동등한 비교하려면 :

대신, 당신은 자신의 값을 비교 ObjectIDequals 방법을 사용한다), 당신은 대신를 사용할 수 있습니다 :

String(story._id) === String(offref.ref) 
+8

문서화되지 않은 기능입니다. – peterjwest

+0

그래서 이것은 mongoose와 같지 않습니다 .Schema.Types.ObjectID? 그들의 설명서는 'auto'라는 메서드 만 가지고 있음을 의미합니다. http://mongoosejs.com/docs/api.html#schema-objectid-js – peterjwest

+1

@peterjwest 오른쪽,'mongoose.Schema.Types.ObjectId'는 정말로 스키마 정의에서 필드 형식 메타 데이터로 사용하기위한 것입니다. – JohnnyHK

1

이 다소 원래의 질문 질문을 넘어,하지만 난 문자열 비교 반환 곳 OBJECTID의의 .equals 방법은 어떤 경우에 false를 돌려줍니다 것으로 나타났습니다 값이 null가 아닌 경우에서도 true 예 :

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

출력 : invitationOwningUser (AN OBJECTID)는 몽구스 스키마를 사용하여 만든 컬렉션에서 와서 linkedOwningUser (또한 OBJECTID)를 사용하여 생성되지 않은 컬렉션에서 온 경우가 발생

compare1: true; compare2: false; compare3: true 

Mongoose (단지 일반적인 MongoDB 메소드).여기

는 invitationOwningUser 포함 된 문서합니다 (owningUser 필드)이다 나에게 수익 등

{ 
    "_id" : ObjectId("05fb8257c95d538d58be7a89"), 
    "linked" : [ 
     { 
      "owningUser" : ObjectId("5781a5685a06e69b158763ea"), 
      "capabilities" : [ 
       "Read", 
       "Update" 
      ] 
     } 
    ] 
} 

그래서, 다음은

{ 
    "_id" : ObjectId("5782faec1f3b568d58d09518"), 
    "owningUser" : ObjectId("5781a5685a06e69b158763ea"), 
    "capabilities" : [ 
     "Read", 
     "Update" 
    ], 
    "redeemed" : true, 
    "expiry" : ISODate("2016-07-12T01:45:18.017Z"), 
    "__v" : 0 
} 

는 linkedOwningUser 포함 된 문서합니다 (owningUser 필드) 인 , 문자열 비교 기술을 사용하여 .equals 메서드가 아니라 ObjectID를 비교할 것입니다.

+0

이것은 중요한 문제처럼 보입니다. 몽구스가 왜 그들을 똑같이 보지 않는지 아십니까? 나는'MongooseBuffer.mixin.equals'에서'if (! Buffer.isBuffer (other))'를 추측하고 있는데, 이것은 내용 검색을 최적화하는 것으로 보인다. 나는 지금 걱정된다! .toString을 .equals로 변환했습니다. (그러나 나는 단지 몽구스를 사용한다. == 그래서 몽구스는 위험하지 않다고 생각한다.) – scipilot

관련 문제