2

2 つのスキーマがあり、一方が他方に埋め込まれている場合:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

// Will embed this in the personSchema below
var addressSchema = new Schema({
    street: String,
    city: String,
    state: {
        type: String,
        uppercase: true
    },
    zip: Number
});

var personSchema = new Schema({
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    emailAddress: {
        type: String,
        lowercase: true
    },
    phoneNumber: Number,
    address: addressSchema
});

module.exports = mongoose.model("Person", personSchema);

が埋め込まれたドキュメントで機能しないようですuppercase: true。エラーはスローされませんが、状態プロパティが大文字にならないだけです。またはそのような任意の種類のオプション。

私はMongooseのドキュメントを検索してきましたが、subDocumentsでこれらの種類の追加オプションを設定しても機能しないと言及している場所が見つからないだけかもしれません.

4

2 に答える 2

1

これが最善の方法であるかどうかは定かではありませんが、(コメントの @nbro の提案に従って) 事前保存フックを追加しましたが、それは機能しているようです:

var addressSchema = new Schema({
    street: String,
    city: String,
    state: {
        type: String,
        uppercase: true
    },
    zip: Number
});

addressSchema.pre("save", function (next) {
    this.state = this.state.toUpperCase();
    next();
});

var personSchema = new Schema({
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    emailAddress: {
        type: String,
        lowercase: true
    },
    phoneNumber: Number,
    address: addressSchema
});

更新 #1:

required: true追加の検証 ( ) や変更 ( )を行わずに単純なスキーマを埋め込んでいる多くのケースを見つけることができるようですuppercase: true。上記の解決策機能しますが、不要なようです。私がおそらくやるべきことは、情報を埋め込むためにオブジェクトリテラルを入れることです:

var personSchema = new Schema({
    ...
    address: {
        street: String,
        city: String,
        state: {
            type: String,
            uppercase: true
        },
        zip: Number
    }
});

別のスキーマを使用する唯一の正当な理由は、埋め込みデータに属性を持たせる必要があり、追加の検証または変更オプションをどのプロパティにも追加する必要がない場合です。が必要な場合は、おそらくデータを埋め込むのではなく、別のオブジェクトとして保存して参照を作成する必要があると思います。_id_id

新しい情報とベスト プラクティスを発見したら、これを更新し続けます。

更新 #2:

プロパティを必須にするなど、埋め込みドキュメントに検証を含めたい場合は、この非常に優れたブログ投稿addressで概説されているように、個別に行う必要があります。

于 2015-12-04T22:29:00.317 に答える
1

最近まで、あるスキーマを別のスキーマに直接埋め込もうとすると、Mongoose は例外をスローしていました。現在は部分的にサポートされているようですが、このような場合はサポートされていないようです。

のフィールドのaddressSchema定義で、スキーマ自体の代わりに の定義オブジェクトのみを使用することで、これを機能させることができます。addresspersonSchema

var addressObject = {
    street: String,
    city: String,
    state: {
        type: String,
        uppercase: true
    },
    zip: Number
};
var addressSchema = new Schema(addressObject);

var personSchema = new Schema({
    firstName: {
        type: String,
        required: true
    },
    lastName: {
        type: String,
        required: true
    },
    emailAddress: {
        type: String,
        lowercase: true
    },
    phoneNumber: Number,
    address: addressObject
});
于 2015-12-05T15:04:25.070 に答える