26

次のようなことをするのは理にかなっているように思えます。

var AvatarSchema = new Mongoose.Schema({
    type: String,
    url: String
});

var UserSchema = new Mongoose.Schema({
    avatars: [AvatarSchema],
    email: String,
    name: String,
    salt: String,
    token: String
});

var ThinUserSchema = new Mongoose.Schema({
    avatars: [AvatarSchema],
    email: String,
    firstname: String,
    lastname: String,
});

var QuestionSchema = new Mongoose.Schema({
    question: String,
    users: [ThinUserSchema]
});

それから後で。. .次のようにします。

var question = new Question({
    question: 'Wut?',
    users: users //where users is an array of instances of a user model of the UserSchema
});

ここでは、質問のユーザー セクションにアバター、電子メール、姓名が入力されることを期待します。. ただし、ユーザー/アバターには既に _id があるため、これらは保持されません。

  • ユーザー/アバターから各 _id を削除するのはばかげているようです。
  • 各ユーザー/アバターを明示的に設定するのは非効率的です。
  • 混合タイプに切り替えると、すべてがそこに配置され、markModified が必要になります。

これらの種類のスキーマの適切なパターンは何ですか?

ありがとう!

4

2 に答える 2

8

あなたの仮定は正しいと思います.Mongooseの埋め込みドキュメントと呼ばれています.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
    }
});

mongoose.model('BlogPost', BlogPost);

免責事項: 項目の前にコンマを入れる必要はありません!

于 2015-04-10T15:28:27.007 に答える
4

私はまだマングース初心者です。私が正しく理解していれば、読む必要があるのはこれだと思います: http://mongoosejs.com/docs/populate.html

他のスキーマでスキーマを参照した、非常に素晴らしく単純な例があります。したがって、特定のスキーマのドキュメントを別のスキーマに含めるには、参照を介して含める方がよいでしょう。必要な場合は、親ドキュメントで populate を呼び出します。子ドキュメントを変更すると、入力された親ももちろん変更されます。

于 2013-03-15T11:22:02.323 に答える