복붙노트

[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. ==============================

    1.직선 == (또는 ===) 비교 기준이 아닌 값으로 두 객체를 비교한다. 그에만 true로 평가합니다 그래서 그들은 둘 참조 매우 동일한 인스턴스 경우.

    직선 == (또는 ===) 비교 기준이 아닌 값으로 두 객체를 비교한다. 그에만 true로 평가합니다 그래서 그들은 둘 참조 매우 동일한 인스턴스 경우.

    대신, 그들의 값을 비교 OBJECTID의 equals 메소드를 사용한다 :

    story._id.equals(offref.ref)
    

    (당신이 널 (null)이 같은 것으로 비교하려는 등) 중 값이 null이 될 수 있다면 코멘트에 @bendytree 노트로서, 당신은 대신 다음을 사용할 수 있습니다 :

    String(story._id) === String(offref.ref)
    
  2. ==============================

    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 방법을 비교하는 문자열 비교 기술을 사용하여 수 있습니다.

  3. from https://stackoverflow.com/questions/11060213/mongoose-objectid-comparisons-fail-inconsistently by cc-by-sa and MIT license