2012-07-05 1 views
3

메신저 JavaScript 및 Mongoose에 새로운 기능이 있습니다. 나는 몽구스를 통해 지속되기를 원하는 약간 이상하게 디자인 된 JSON으로 끝났다. , something_else, 뭔가 (아마도 다른 사람이 있습니다 항상 A1도 A2가되지 않음)도 다양하다 배열이없는 중첩 문서로 내 JSON에 대한 유효한 몽구스 스키마를 정의 하시겠습니까?

A1

{name : "a_string", a1 : {something : 'a_number', something_else : 'a_number'}, a2 : {...} } 
는, A2
변수입니다

이이 JSON의 예입니다 다른 식별자 일 수 있습니다 (속성입니다).

아마도 이상한 JSON을 디자인 할 때 내 잘못이라고 생각 하겠지만 스키마를 정의하는 가장 좋은 방법은 무엇일까요?

나는 다양한 대안이 없다, 둘 다 저를 설득 :

Schema { 
     myJSON : [] 
} 

이 아주 못생긴하지만 지금은 myJSON로 내 JSON을 저장할 수 [0] = {이름 : "theName"...}. Ofc는 가장 추악하지만 가장 가까운 곳에서 원래의 데이터 구조를 발견했습니다.

이 더 예쁜하지만 그때, 최종 JSON 내가 원래 하나가 didnt가 많은 배열과 indirections을해야합니다 몇 가지 문제를 발견 한

json Schema { 
    name: String, 
    parts: [part] 
} 

part Schema { 
    name : String, 
    props : [prop] 
} 

prop Schema { 
    name : String, 
    value : Numeric 
} 

또 다른 :

{name :"a_string", parts:[{name : "a1", 
      props : [{name : "something", value: 'a_number'}]},{...}]} 

이다가 이러한 모든 성가신 배열을 Schema에서 제거하는 방법은 무엇입니까?

UPDATE :

var mySchema = new Schema({ 
     name : String 
    , valid : Boolean 
    , parts : {} 
}); 

는 그런 다음 "소품"이름을 넣어 제외하고 내가 (원하는 모든 JSON을 포함 : 내 데이터 모델을 조금 적응할 수 있기 때문에

마지막으로 나는 내 문제를 해결 한 외부). 이것은 내가 생각했던 방식이 아니지만 잘 작동합니다 (제 생각에).

답변

4

너는 몽구스 embedded documents을 사용하고있는 것처럼 보입니다.

임베디드 문서가 항상 배열 안에 포장되는지 확실하지 않습니다. 이 몽구스 문서의 예를 다음

:

var Comments = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 

var BlogPost = new Schema({ 
    author : ObjectId 
    , title  : String 
    , body  : String 
    , date  : Date 
    , comments : [Comments] 
    , meta  : { 
     votes : Number 
     , favs : Number 
    } 
}); 

블로그 게시물은 할 수는 severals 댓글을 포함하고, (내가 옳다 경우 당신의 문제처럼) 댓글 배열 내부 포장됩니다.

스키마 정의에서 해당 배열을 제거하면 어떨까요?

[Comments] 대신 Comments 사용 :

var BlogPost = new Schema({ 
    author : ObjectId 
    , title  : String 
    , body  : String 
    , date  : Date 
    , comments : Comments 
    , meta  : { 
     votes : Number 
     , favs : Number 
    } 
}); 

나는 지금을 시도 할 수 없습니다.

그렇지 않으면 작동하지 않는 경우 mongoose virtual attributes을 사용하는 것이 좋습니다.

편집

가상 속성을 사용하여, 당신은 이런 식으로 뭔가를 할 수 :

BlogPost 
    .virtual('customComment') 
    .get(function() { 
     return this.comments[0]; 
    }); 

이 첫 번째 코멘트 항목 객체 whithout 배열을 반환합니다.

var BlogPost = mongoose.model('BlogPost'); 

BlogPost 
    .find({ title: 'foo' }) 
    .populate('comments') 
    .run(function (err, post) { 

    console.log(post.customComment); // returns the first comment without array 
}); 

테스트하지 않은 경우 오타가있을 수 있습니다.

+0

예, 포함 된 문서는 배열 안에 포장해야합니다. (가상을 사용하여 이상한 수정을 시도 할 수 있다고 생각합니다 ... 아이디어를 자세히 설명해 주시겠습니까? 감사합니다. – Dredok