2012-07-22 12 views
14

은 모델이 new'ed 일 때 _id 필드가 자동으로 생성되도록 모델 스키마를 몽구스로 선언하는 방법이 있습니까? 예를 들어거기에 몽구스 모델 new'ed 때 자동으로 ObjectId 생성하는 방법은 무엇입니까?

: 새로운 ObjectId가()가 아니라 때문에

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()} 

하지만 작동하지 않습니다 물론

을 다하겠습니다!, 좋은 생각 스키마 초기화를 호출합니다. 새로운 Persion()을 두 번 호출하면 동일한 _id 값을 갖는 두 개의 객체를 생성합니다.

그래서 내가 할 때마다 "새로운 Person()"을 할 때마다 새로운 ObjectId()가 생성되도록하는 방법이 있습니까?

내가 이것을하려고하는 이유는 추가 처리를 위해 새로운 사람의 _id 값의 값을 알아야하기 때문입니다.

는 또한 시도 :

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

그렇다하더라도, 문서가 ObjectId가 포함되어 있지 않습니다. 하지만 데이터베이스를 보면, 그것을 포함하고 있습니다.

p.s. 나는 몽구스를 사용하고있다. 2.7.1

p.p.s. 내가 같은 사람을 만들 때 내가 수동으로 ObjectId가를 만들 수 있습니다 알고

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

하지만 난 오히려 나는 사람이 새로운하려는 새로운 IT마다에 ObjectId가를 수입하고있을 필요 없다. 추측 전 mongodb에 대한 자바 드라이버를 사용하는 데 익숙해 졌는데, 여기서 Model 생성자의 _id 필드 값을 만들 수 있습니다.

답변

17

var person = new Person(); person._id가 ID를 제공해야합니다 (아직 저장되지 않은 경우에도 해당). 그것을 인스턴스화하면 이드에게 충분합니다. 당신은 여전히 ​​후 저장할 수 있습니다, 그것은의 ID뿐만 아니라

+2

그래, 스키마에'_id' 필드를 포함 할 필요가 없습니다. – JohnnyHK

+2

@ JohnnyHK, 당신과 Last Rose Studios가 맞습니다. 그것은 당신이 말한 것과 정확히 같습니다. 나는 "_id : ObjectIdSchema"라는 줄을 주석 처리하고, new'ed Person()에 ID가있을 때! 그러나 내가 그것을 주석 처리하지 않았을 때, 이드는 절대로 생성되지 않았습니다. 고마워! 매우 감사. – Khon

+2

새로운 시청자의 경우 이후로이 동작이 변경 되었습니까? 오늘 나는 모델 스키마 안에'_id'를 추가하면'default : new mongoose.Types.ObjectId()'가 강제로 작동하지 않는 것을 언급하게되었습니다! –

6

대신 사람 개체의 나머지 저장합니다 : 당신이해야 할

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

:

_id: {type:ObjectIdSchema, default: function() { return new ObjectId()} } 
+6

이것은 필요하지 않습니다 ..._id가 무엇인지 지정하지 않으면 기본적으로 ObjectId가 생성되고 – wlingke

+0

[오류 : 문서에 _id가 있어야 저장됩니다.] –

+0

이 응답은 예를 들어 하위 문서가 자동 생성되지 않기 때문에 여전히 유용합니다. _id –

5

auto 추가하기 플래그 :

_id: { 
    type: mongoose.Schema.Types.ObjectId, 
    index: true, 
    required: true, 
    auto: true, 
    } 

source

관련 문제