3

JavaScriptとマングースはかなり新しいです。私はマングースを介して永続化したい少し奇妙なデザインのJSONで終わりました。

これは、このJSONの例です。

{name : "a_string", a1 : {something : 'a_number', something_else : 'a_number'}, a2 : {...} }

a1、a2は可変です(常にa1もa2も存在しない、おそらく他の存在もあります) 何か、something_elseも可変であり、異なる識別子にすることができます-それらはプロパティです-。

たぶん、そのような奇妙なJSONを設計するのは私のせいですが、そのスキーマを定義する最良の方法は何でしょうか?

私にはさまざまな選択肢がありますが、どちらも私を納得させません:

Schema {
      myJSON : []
}

これは非常に醜いですが、JSONをmyJSON [0] = {name:"theName"...}として保存できるようになりました。Ofcは最も醜いですが、私が見つけた元のデータ構造に最も近いものです。

もう1つ

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

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

prop Schema {
   name : String,
   value : Numeric
}

これはもっときれいですが、いくつかの問題があります。最終的なJSONには、元のJSONにはなかった多くの配列と間接参照が含まれます。

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

これらの厄介な配列をすべてスキーマから削除する方法はありますか?

アップデート:

データモデルを少し適応させることができたので、最後に問題を解決しました。

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

次に、「props」には必要なすべてのJSONが含まれます(名前が外部に配置されている場合を除く)。これは私が考えていた方法ではありませんが、うまく機能します(私は思います)。

4

1 に答える 1

4

Mongoose の埋め込みドキュメントを使用しているようです。

埋め込みドキュメントが常に配列内にラップされるかどうかはわかりません。

このマングースのドキュメントの例に従ってください:

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
    }
});

BlogPost には複数のコメントを含めることができ、コメントは配列内にラップされます (私が正しければ問題のように)。

スキーマ定義でその配列を取り除くとどうなりますか?

Commentsの代わりに使用[Comments]:

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

今は試すことができません。

それ以外の場合は、マングースの仮想属性を使用するアイデアがあります。これが機能しない場合はお知らせください。

編集

仮想属性を使用すると、次のようなことができます。

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

これは、配列なしで最初のコメント エントリ オブジェクトを返します。

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
});

テストされていません。これにはタイプミスが含まれている可能性があります。

于 2012-07-05T10:34:05.183 に答える