Мангуст заселить - PullRequest
       4

Мангуст заселить

5 голосов
/ 30 декабря 2011

Вот мой тестовый код, который я не могу понять, почему он не работает, так как он очень похож на тест 'заполнение нескольких дочерних элементов подмассива за раз' .

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

Произошла ошибка

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

Обновление

Избавился от OwnedTag и переписал MovieSchema следующим образом

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

Рабочий код https://gist.github.com/1541219

Ответы [ 2 ]

2 голосов
/ 20 октября 2012

Ваша переменная OwnedTagSchema должна быть определена до того, как вы ее используете, иначе вы в итоге будете делать это:

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

Переместить его выше MovieSchema определения.

1 голос
/ 30 декабря 2011

Я ожидаю, что ваш код тоже будет работать. Работает ли это, если вы положите OwnedTag прямо в MovieSchema, вот так?

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

редактирование:

var MovieSchema = new Schema({
  title: String,
  tags: [{ type: Schema.ObjectId, ref: 'OwnedTag' }]
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...