2014-08-30 3 views
0

Node (0.10.5)/Mongo (2.4)/Mongoose (3.6)를 사용하여 게임을 빌드하고 Mongoose 스키마가 있습니다. . 몽구스 스키마 - 하위 문서의 배열 대신 Object 사용

var GameStateSchema = new Schema(
    { 
     buildings: { 
      // This object will contain buildings of the same structure, e.g. 
      // "1": {name: "cabin", x: 128, y: 0}, 
      // "2": {name: "lighthouse", x: 192, y: 64} 
      // It'll grow to several hundred buildings. 
     }, 
     nextId: 3 
    } 
); 

var BuildingSchema = new Schema(
    { 
     name: String, x: Number, y: Number 
    } 
); 

buildings 객체의 각 건물은 BuildingSchema를 사용할 수 있도록하는 가장 좋은 방법은 무엇입니까

? 나는 모든 것을 수작업으로 검증하는 길을 가고 싶지 않습니다!

참고 : buildings 개체는 배열이 아닙니다. buildings: [BuildingSchema], 나는 Mongo가 큰 배열 (그리고 건물의 순서는 중요하지 않음)로 나쁘게 수행하는 것을 듣기 때문에.

+1

모든 것을 검증하면 무엇을 의미합니까? 또한 GameStateSchema에 값을 정의 할 수 없으며 스키마에는 데이터가 아닌 유형 등이 들어 있습니다. –

+0

"유효성 검사"란 캐스팅 검사와 데이터베이스에 쓰는 '스키마 엄격 모드'를 의미합니다. 더 정교한 몽구스 검증 방법이 아닙니다. 그리고 하나님, 네, 죄송합니다, 저는 데이터 라인을 주석으로 만드는 것을 잊었습니다! 지금 편집 중입니다. – chichilatte

+1

당신의 반대에도 불구하고 여기에'건물'을위한 배열을 사용해야합니다. 질문 없음. – JohnnyHK

답변

0

아, 대답은 간단합니다. 같은 것을 사용할 수 있습니다 ...

buildings: [BuildingSchema] 

표기법뿐만 아니라 배열. 예를 들어, 당신은 새로운 건물을 추가하면 ...

GameStateSchema.update({$set: {"buildings.1": {name: "cabin", x:128, y: 0} }}) 

몽구스, 예를의 BuildingSchema를 사용하여 아주 기본적인 (그러나 중요한) 검증을하고 새로운 건물을 추가합니다 건물은 name, xy 만 가질 수 있습니다.

$ 집합을 지정하기 전에 buildings 배열을 명시 적으로 만들지 않으면 기본적으로 개체가됩니다. 비트 카운터 직관적이지만 매우 편리 :)

EDIT - 내가 너무 빨리 말했어, Mongoose 모델 인스턴스를 통해 buildings에 액세스하는 것이 배열 일 때만 작동합니다. 문제는 여전히 남아 있습니다.

관련 문제