2015-02-03 4 views
0

필자는 JS 사용자 정의 유형 "Piece"를 갖고 있으며 문서 당 EJSON에 사용자 정의 데이터 유형으로 추가했습니다. 나는 이것을 {최상위 오브젝트가 커스텀 타입이 될 수 없기 때문에} {piece : aPiece} 형식의 콜렉션 "PieceHolders"에 저장한다.Meteor 사용자 정의 유형 찾기

내 유성 삽입 방법에서, 나는 먼저 과 같은 이름과 작곡가를 기반으로 복제본을 확인하고 싶습니다. PieceHolders.findOne ({ "piece.name": "Sample1", "piece.composer": "PJD "}); 이제 클라이언트에서는 정상적으로 작동하지만 서버에서는 정상적으로 작동하지 않습니다. 따라서 중복으로 끝납니다. 왜? Mongo 문서는 다음과 같습니다 : { "piece": ""EJSON $ type ":"Piece ","EJSON $ value ": {"EJSONname ":"Sample1 ","EJSONcomposer ":"PJD " ... 그리고 나는 서버를 적절히 검색하지 않을 것입니다.

전 변형을 사용하려고 생각했지만 데이터가 발견 된 후에는 마사지되지 않았습니다. 그리고 말할 필요도없이 똑같은 검색이 클라이언트와 서버 모두에서 작동해야합니다.

무엇을해야합니까?

PieceHolders.insert({ 
    piece: new Piece({name: 'Sample 1', composer: 'PJD'}) 
}); 
:

PieceHolders.findOne({ 
    piece: new Piece({name: 'Sample 1', composer: 'PJD'}) 
}); 

가 위의 쿼리는 사용자 정의 유형에 삽입 된 문서를 일치 :

답변

0

선택기에서 사용자 정의 형식의 인스턴스를 사용, 사용자 정의 유형을 포함하는 필드를 일치 시키려면

서버 및 클라이언트 모두에서 사용자 지정 유형이 선언되어 있는지 확인하십시오.

Piece = function (obj) { 
    this.name = obj && obj.name; 
    this.composer = obj && obj.composer; 
} 

Piece.prototype = { 
    // typeName: function ... 
    // clone: function ... 
    // equals: function ... 

    toJSONValue: function() { 
    return { 
     name: this.name, 
     composer: this.composer 
    }; 
    } 
}; 

EJSON.addType("Piece", function fromJSONValue(value) { 
    return new Piece(value); 
}); 

OP가 지적했듯이 위의 해결 방법은 서버에서 EJSON 사용자 지정 유형의 선택된 속성을 쿼리 할 수 ​​없습니다. 이 경우 EJSON 유형을 추가하는 대신 Mongo 콜렉션에 변환을 사용하는 것이 좋습니다.

수집 .findOne() 또는 커서 .fetch를 사용할 때의 우리가 문서의 piece 필드는 Piece 개체로 반환 할 가정 해 봅시다().

우선 Piece과 관련된 EJSON.addType 신고에 대해 의견을 말하고 제거하십시오. 이렇게하면 Piece 객체를 EJSON 표현 대신 JSON 객체로 데이터베이스에 저장할 수 있습니다.

// Comment or remove lines below 
// 
// EJSON.addType("Piece", function fromJSONValue(value) { 
// return new Piece(value); 
// }); 

둘째, 추가 또는 Piece 객체를 포함하는 모든 몽고 모음에 대한 변환 옵션을 수정합니다. Piece 개체를 포함하는 모든 필드를 해당 생성자에 대한 호출로 바꿉니다.

PieceHolders = new Mongo.Collection('PieceHolders', { 
    transform: function (doc) { 
    if (doc.piece) doc.piece = new Piece(doc.piece); 
    return doc; 
    } 
}); 

새 문서를 삽입하고 검색하여 테스트 할 수 있습니다.

PieceHolders.insert({ 
    piece: new Piece({name: 'name1', composer: 'Tom'}) 
}); 
PieceHolders.insert({ 
    piece: new Piece({name: 'name2', composer: 'Tom'}) 
}); 

PieceHolders.find({'piece.composer': 'Tom'}).fetch(); 
/* Should return the 2 documents we inserted! 
[ 
    { piece: { name: 'name1', composer: 'Tom' }, _id: 'YFRiWHsTjQbFL7YSb' }, 
    { piece: { name: 'name2', composer: 'Tom' }, _id: 'd4SoeLfWrpRyXBe9y' } 
] 
*/ 

PieceHolders.findOne().piece instanceof Piece 
/* Should return true! */ 

우리는 Piece 클래스에 더 많은 속성을 추가하고 필요한 경우 그 toJSONValue 방법을 업데이트를 진행할 수 있습니다.

+0

당신의 해결책은 이름과 작곡가보다 Piece에 더 많은 부분이 있기 때문에 도움이되지 않습니다.하지만 이름과 작곡가 모두에 일치가있을 경우에만 복제본을 정의하고 싶습니다.그러나 Piece에는 measure 등의 배열뿐만 아니라 catalogReference도있을 수 있습니다. 모든 것이 일치하는 경우에만 접근 방식이 작동하며, 이는 내가 원하는 것이 아닙니다. – pdavidow

+0

또는 특정 작곡가가 모든 곡을 찾고 싶다고 가정 해 보겠습니다. – pdavidow

+0

답변을 확장했습니다. 도움이되는지 알려주세요! – xamfoo

관련 문제