30

モデルが新しく作成されたときに_idフィールドが自動生成されるように、マングースでモデルスキーマを宣言する方法はありますか?

例えば:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectIdSchema = Schema.ObjectId;
var ObjectId = mongoose.Types.ObjectId;

var PersonSchema = new Schema({
    _id:            ObjectIdSchema,
    firstName:      {type: String, default: 'N/A'},
    lastName:       {type: String, default: 'N/A'},
    age:            {type: Number, min: 1}
});

var Person = mongoose.model('Person', PersonSchema);

最初、私は素晴らしいと思いました!、私はただやります

_id:    {type:ObjectIdSchema, default: new ObjectId()}

しかしもちろん、それは機能しません。 new ObjectId() はスキーマの初期化時にのみ呼び出されるためです。そのため、new Persion() を 2 回呼び出すと、同じ _id 値を持つ 2 つのオブジェクトが作成されます。

「new Person()」を実行するたびに、新しい ObjectId() が生成されるようにする方法はありますか?

これをやろうとしている理由は、さらに処理するために新しい人の _id 値の値を知る必要があるためです。

私も試しました:

var person = new Person({firstName: "Joe", lastName: "Baz"});
person.save(function(err, doc, num){
    console.log(doc._id);
});

それでも、doc には ObjectId が含まれていません。しかし、データベースを見ると、それが含まれています。

PS私はマングース2.7.1を使用しています

pps 私は、人を作成するときに ObjectId を手動で作成できることを知っています。

var person = new Person({_id: new ObjectId(), firstName: "Joe", lastName: "Baz"});

しかし、私は ObjectId をインポートする必要はなく、Person を新しくしたいたびにそれを新しくする必要があります。私は mongodb 用の Java ドライバーを使用することに慣れていると思います。そこでは、Model コンストラクターの _id フィールドの値を作成するだけです。

4

5 に答える 5

30

var person = new Person(); を呼び出した瞬間 person._id は、ID を提供する必要があります (まだ保存されていなくても)。インスタンス化するだけで、ID を付与できます。その後も保存できます。これにより、IDと残りの人物オブジェクトが保存されます

于 2012-07-23T00:08:16.603 に答える
15

それ以外の:

_id:    {type:ObjectIdSchema, default: new ObjectId()}

やったほうがいい:

_id:    {type:ObjectIdSchema, default: function () { return new ObjectId()} }
于 2014-01-18T13:46:37.097 に答える