web-dev-qa-db-ja.com

スキーマを定義せずにMongooseをどのように使用しますか?

Mongooseの以前のバージョン(node.js用)には、スキーマを定義せずに使用するオプションがありました

var collection = mongoose.noSchema(db, "User");

ただし、現在のバージョンでは「noSchema」関数は削除されています。私のスキーマは頻繁に変更される可能性が高く、定義されたスキーマに実際には適合しないので、スキーマレスモデルをmongooseで使用する新しい方法はありますか?

103

これがあなたが探しているものだと思います Mongoose Strict

オプション:strict

Strictオプション(デフォルトで有効)は、スキーマに指定されていないモデルインスタンスに追加された値がdbに保存されないようにします。

注:正当な理由がない限り、falseに設定しないでください。

    var thingSchema = new Schema({..}, { strict: false });
    var Thing = mongoose.model('Thing', thingSchema);
    var thing = new Thing({ iAmNotInTheSchema: true });
    thing.save() // iAmNotInTheSchema is now saved to the db!!
154

実際に「混合」(_Schema.Types.Mixed_)モードは、Mongooseでまさにそれを行うようです...

schema-lessfreeform JSオブジェクトを受け入れますそれを投げることができます。後でそのオブジェクトで手動で保存をトリガーする必要があるようですが、それは公正なトレードオフのようです。

混合

「何でも可能」なSchemaTypeであるため、その柔軟性は、維持するのが難しいというトレードオフの関係にあります。 Mixedは、_Schema.Types.Mixed_を介して、または空のオブジェクトリテラルを渡すことで使用できます。以下は同等です:

_var Any = new Schema({ any: {} });
var Any = new Schema({ any: Schema.Types.Mixed });
_

スキーマレス型であるため、値を任意の値に変更できますが、Mongooseはこれらの変更を自動検出して保存する機能を失います。混合型の値が変更されたことをMongooseに「伝える」には、変更したばかりの混合型へのパスを渡すドキュメントの.markModified(path)メソッドを呼び出します。

_person.anything = { x: [3, 4, { y: "changed" }] };
person.markModified('anything');
person.save(); // anything will now get saved
_
53
kwhitley

ちょっとクリス、 Mongous を見てください。開発中のスキーマは非常に頻繁に変更されるため、mongooseでも同じ問題が発生していました。 Mongousを使用すると、「スキーマ」を大まかに定義および変更できる一方で、Mongooseのシンプルさが得られました。標準のJavaScriptオブジェクトを単純に構築し、そのようにデータベースに保存することにしました

function User(user){
  this.name = user.name
, this.age = user.age
}

app.post('save/user', function(req,res,next){
  var u = new User(req.body)
  db('mydb.users').save(u)
  res.send(200)
  // that's it! You've saved a user
});

Mongooseよりもはるかに単純ですが、「pre」などのクールなミドルウェアをお見逃しなく。しかし、私はそれを必要としませんでした。お役に立てれば!!!

14
Hacknightly