2013-04-02 63 views
10

Tôi đang cố gắng xác định lược đồ của db của tôi trong mongoose. Tại thời điểm này, tôi thực hiện điều này:Mongoose: Truyền đến ObjectId không thành công cho giá trị

var Schema = mongoose.Schema; 
var today = new Date(2011, 11, 12, 0, 0, 0, 0); 


var personSchema = new Schema({ 
    _id : Number, 
    name: { type: String, required: true }, 
    tel: { type: String, required: true }, 
    email: { type: String, required: true }, 
    newsitems: [{ type: Schema.Types.ObjectId, ref:'NewsItem'}] 
}); 

var taskSchema = new Schema({ 
    _id: Number, 
    description: { type: String, required: true }, 
    startDate: { type: Date, required: true }, 
    newsitems: [{ type: Schema.Types.ObjectId, ref:'NewsItem'}] 
}); 

var newsSchema = new Schema({ 
    _id: Number, 
    creator : { type: Schema.Types.ObjectId, ref: 'Person' }, 
    task : { type: Schema.Types.ObjectId, ref: 'Task' }, 
    date: { type: Date, required:true }, 
    loc: {type: String, required: true } 
}); 

var NewsItem = mongoose.model('NewsItem', newsSchema); 
var Person = mongoose.model('Person', personSchema); 
var Task = mongoose.model('Task', taskSchema); 



var tony = new Person({_id:0, name: "Tony Stark", tel:"234234234", email:"[email protected]" }); 
var firstTask = new Task({_id:0, description:"Get an interview with the president", startDate:today}); 
var newsItem1 = new NewsItem({_id:0, creator: tony.id, task: firstTask.id, date: today, loc: "NY"}); 

newsItem1.save(function (err) { 
    if (err) console.log(err); 

    firstTask.save(function (err) { 
     if (err) console.log(err); 
    }); 

    tony.save(function (err) { 
     if (err) console.log(err); 
    }); 
}); 



NewsItem 
.findOne({ loc: "NY" }) 
.populate('creator') 
.populate('task') 
.exec(function (err, newsitem) { 
    if (err) console.log(err) 
    console.log('The creator is %s', newsitem.creator.name); 
}) 

Tôi tạo các lược đồ và cố lưu một số dữ liệu.

Lỗi:

{ message: 'Cast to ObjectId failed for value "0" at path "creator"', 
    name: 'CastError', 
    type: 'ObjectId', 
    value: '0', 
    path: 'creator' } 

tôi đã viết mã này dựa trên: http://mongoosejs.com/docs/populate.html#gsc.tab=0

Các db tôi cố gắng tạo ra vẻ như thế này: Specify schema in mongoose.

Làm cách nào để khắc phục sự cố này?

Trả lời

14

Ví dụ từ tài liệu mongoose mà bạn tham chiếu sử dụng Number cho trường personSchema._idObjectId cho các trường khác.

Tôi cho rằng họ làm điều này trong ví dụ chỉ để chứng minh rằng có thể sử dụng. Nếu bạn không chỉ định _id trong lược đồ, ObjectId sẽ là mặc định.

Tại đây, tất cả hồ sơ của bạn có trường _idObjectId, nhưng bạn vẫn coi chúng như số. Hơn nữa, các trường như personIDtaskID không tồn tại, trừ khi bạn đã rời khỏi phần mà bạn xác định chúng.

Nếu bạn muốn sử dụng các số cho tất cả các trường _id của mình, bạn phải xác định rằng trong các lược đồ.

var newsSchema = new Schema({ 
    _id: Number, 
    _creator: {type: ObjectId, ref: "Person"}, 
    // ... 
}) 

var personSchema = new Schema({ 
    _id: Number, 
    // ... 
}) 

Sau đó, để tạo ra một mục tin tức với một ID riêng, và gán nó vào một tác giả:

var tony = new Person({_id: 0}); 
var newsItem = new NewsItem({_id: 0, creator: tony.id}); 

Tuy nhiên, điều cần lưu ý ở đây là khi bạn sử dụng một cái gì đó khác hơn ObjectId như _id , bạn tự chịu trách nhiệm tự quản lý các giá trị này. ObjectIds được autogenerated và không yêu cầu quản lý thêm.

Chỉnh sửa: Tôi cũng nhận thấy rằng bạn đang lưu trữ ref trên cả hai mặt của các hiệp hội của bạn. Điều này là hoàn toàn hợp lệ và bạn có thể muốn làm điều đó đôi khi, nhưng lưu ý rằng bạn phải tự lo việc lưu trữ các tham chiếu trong móc pre.

+0

thx để được trợ giúp, mặc dù khi truy vấn và điền, tôi gặp lỗi. Bạn có biết tôi đã làm gì sai không? (đã cập nhật câu hỏi) – Ojtwist

+0

Bạn đã lưu chúng chưa? Nó có vẻ như nó sẽ làm việc, trừ khi nó tải một mục tin tức trước đó đã được lưu mà không có một người sáng tạo. – numbers1311407

+0

Tôi chỉ nói thêm rằng, mặc dù tôi nghĩ rằng tôi đang làm sai. – Ojtwist

4

Tôi đã nhận được lỗi này sau khi tạo lược đồ: CastError: Cast to ObjectId failed for value “[object Object]” at path “_id” Sau đó sửa đổi và không thể theo dõi nó. Tôi đã xóa tất cả các tài liệu trong bộ sưu tập và tôi có thể thêm 1 đối tượng nhưng không thể thêm một giây. Tôi đã xóa bộ sưu tập ở Mongo và làm việc như Mongoose tái tạo bộ sưu tập.

Các vấn đề liên quan