선택기에서 사용자 정의 형식의 인스턴스를 사용, 사용자 정의 유형을 포함하는 필드를 일치 시키려면
서버 및 클라이언트 모두에서 사용자 지정 유형이 선언되어 있는지 확인하십시오.
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 방법을 업데이트를 진행할 수 있습니다.
당신의 해결책은 이름과 작곡가보다 Piece에 더 많은 부분이 있기 때문에 도움이되지 않습니다.하지만 이름과 작곡가 모두에 일치가있을 경우에만 복제본을 정의하고 싶습니다.그러나 Piece에는 measure 등의 배열뿐만 아니라 catalogReference도있을 수 있습니다. 모든 것이 일치하는 경우에만 접근 방식이 작동하며, 이는 내가 원하는 것이 아닙니다. – pdavidow
또는 특정 작곡가가 모든 곡을 찾고 싶다고 가정 해 보겠습니다. – pdavidow
답변을 확장했습니다. 도움이되는지 알려주세요! – xamfoo