53

デザインに FlashcardSchemas と PackageSchemas があります。1 つのフラッシュカードが異なるパッケージに属することができ、パッケージに異なるフラッシュカードを含めることができます。

以下に、私のマングース スキーマ定義の簡略版を示します。

// package-schema.js
var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;

var PackageSchema = new Schema({
    id          : ObjectId,
    title       : { type: String, required: true },
    flashcards  : [ FlashcardSchema ]
});

var exports = module.exports = mongoose.model('Package', PackageSchema);

// flashcard-schema.js
var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;

var FlashcardSchema = new Schema({
    id      : ObjectId,
    type        : { type: String, default: '' },
    story       : { type: String, default: '' },
    packages    : [ PackageSchema ]
});

var exports = module.exports = mongoose.model('Flashcard', FlashcardSchema);

上記のコメントからわかるように、これら 2 つのスキーマ定義は別々のファイルに属し、相互に参照しています。

予想どおり、PackageSchema が定義されていないという例外が発生します。どうすればマングースと多対多の関係をマッピングできますか?

4

6 に答える 6

6

正しい方法で実行していますが、問題は、packageSchema を flashcard-schema.js に含める必要があることです。逆もまた同様です。そうしないと、これらのファイルはあなたが何を参照しているのかわかりません

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;
    PackageSchema = require('./path/to/package-schema.js')

var FlashcardSchema = new Schema({
    id      : ObjectId,
    type        : { type: String, default: '' },
    story       : { type: String, default: '' },
    packages    : [ PackageSchema ]
});
于 2012-06-21T10:43:07.560 に答える
2

Schema.add() メソッドを使用して、前方参照の問題を回避できます。

この (テストされていない) ソリューションは、スキーマを 1 つの .js ファイルに入れます

モデル/index.js

var Schema = mongoose.Schema,
    ObjectId = Schema.ObjectId;

// avoid forward referencing
var PackageSchema = new Schema();
var FlashcardSchema = new Schema();

PackageSchema.add({
    id          : ObjectId,
    title       : { type: String, required: true },
    flashcards  : [ FlashcardSchema ]
});

FlashcardSchema.add({
    id      : ObjectId,
    type        : { type: String, default: '' },
    story       : { type: String, default: '' },
    packages    : [ PackageSchema ]
});

// Exports both types
module.exports = {
    Package:   mongoose.model('Package', PackageSchema),
    Flashcard: mongoose.model('Flashcard', FlashcardSchema)
};  
于 2012-12-21T13:29:25.470 に答える
0

You're thinking of this too much like a relational data store. If that's what you want, use MySQL (or another RDBMS)

Failing that, then yes, a third schema could be used, but don't forget it'll still only be the id of each object (no joins, remember) so you'll still have to retrieve each other item in a separate query.

于 2012-06-21T09:52:41.177 に答える