2011-12-30 42 views
5

Đây là mã thử nghiệm của tôi mà tôi không thể tìm ra lý do tại sao nó không hoạt động, vì nó rất giống với kiểm tra 'populating multiple children of a sub-array at a time'.Mongoose populate

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    ObjectId = Schema.ObjectId; 

mongoose.connect('mongodb://localhost/testy'); 

var UserSchema = new Schema({ 
    name: String 
}); 

var MovieSchema = new Schema({ 
    title: String, 
    tags: [OwnedTagSchema] 
}); 

var TagSchema = new Schema({ 
    name: String 
}); 

var OwnedTagSchema = new Schema({ 
    _name: {type: Schema.ObjectId, ref: 'Tag'}, 
    _owner: {type: Schema.ObjectId, ref: 'User'} 
}); 

var Tag = mongoose.model('Tag', TagSchema), 
    User = mongoose.model('User', UserSchema), 
    Movie = mongoose.model('Movie', MovieSchema); 
    OwnedTag = mongoose.model('OwnedTag', OwnedTagSchema); 

User.create({name: 'Johnny'}, function(err, johnny) { 
    Tag.create({name: 'drama'}, function(err, drama) { 
     Movie.create({'title': 'Dracula', tags:[{_name: drama._id, _owner: johnny._id}]}, function(movie) { 

      // runs fine without 'populate' 
      Movie.find({}).populate('tags._owner').run(function(err, movies) { 
       console.log(movies); 
      }); 
     }); 
    }) 
}); 

lỗi được sản xuất là

node.js:201 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
TypeError: Cannot call method 'path' of undefined 
    at /Users/tema/nok/node_modules/mongoose/lib/model.js:234:44 

Cập nhật

Chấn thoát khỏi từ OwnedTag và viết lại MovieSchema như mã

var MovieSchema = new Schema({ 
    title: String, 
    tags: [new Schema({ 
     _name: {type: Schema.ObjectId, ref: 'Tag'}, 
     _owner: {type: Schema.ObjectId, ref: 'User'} 
    })] 
}); 

Làm việc này https://gist.github.com/1541219

Trả lời

1

Tôi cũng hy vọng mã của bạn hoạt động. Nó có hoạt động không nếu bạn đặt OwnedTag ngay trong MovieSchema, như vậy?

var MovieSchema = new Schema({ 
    title: String, 
    tags: [{ 
      _name: {type: Schema.ObjectId, ref: 'Tag'}, 
      _owner: {type: Schema.ObjectId, ref: 'User'} 
     }] 
}); 

chỉnh sửa:

var MovieSchema = new Schema({ 
    title: String, 
    tags: [{ type: Schema.ObjectId, ref: 'OwnedTag' }] 
}); 
+0

Không, cùng một kết quả :-( – spacevillain

+1

Ah. Thực ra, hãy quay trở lại kiểu gốc của bạn. Bạn đang sử dụng '.populate' nhưng bạn đang sử dụng một subdocument cho' tags', chứ không phải ref. hy vọng nó hoạt động - chúng ta đang tiến xa hơn nữa từ sức mạnh của một cơ sở dữ liệu NoSQL - nhưng, có lẽ điều này sẽ làm việc - xem thêm nỗ lực thứ 2 ở trên. – danmactough

+0

Điều này phá vỡ mọi thứ :-(Tôi không hiểu sự khác biệt giữa https://github.com/LearnBoost/mongoose/blob/master/test/model.ref.test.js#L1109 Có lẽ bạn có thể giúp tôi xem nó? – spacevillain

2

bạn biến OwnedTagSchema phải được xác định trước khi bạn sử dụng nó hoặc bạn sẽ kết thúc làm cơ bản này:

var MovieSchema = new Schema({ 
    title: String, 
    tags: [undefined] 
}); 

Move nó ở trên MovieSchema nét.