Как я могу хранить данные, отличные от ObjectId, с помощью заполнения Mongoose?

Взяв пример отсюда

http://mongoosejs.com/docs/populate.html

Если я попытаюсь настроить его так, чтобы «поклонники» также содержали рейтинг

var db = require('houselib/db');
var Schema = db.Schema;
var mongoose = db.mongoose;

var PersonSchema = new Schema({
    name    : String
    , age     : Number
    , stories : [{ type: Schema.ObjectId, ref: 'Story' }]
});

var StorySchema = new Schema({
    _creator : { type: Schema.ObjectId, ref: 'Person' }
    , title    : String
    , fans     : [{ type: Schema.ObjectId, ref: 'Person', rating: Number}]
});

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

var aaron = new Person({ name: 'Aaron', age: 100 });

aaron.save(function (err) {
    if (err) throw err;

  var story1 = new Story({
      title: "A man who cooked Nintendo"
    , _creator: aaron._id
    , fans: [{type: aaron._id, rating: 4}]
  });

  story1.save(function (err) {
    if (err) throw err;
        Story
        .find({ _creator: aaron._id })
        .populate('_creator') // <-- not really necessary
        .run(function (err, stories) {
            if (err) throw err;
            console.log('The stories JSON is an array: ', stories);
        })
  });

})

Я получаю следующую ошибку

CastError: приведение к неопределенному не удалось для значения "[object Object]"


person deltanovember    schedule 21.05.2012    source источник


Ответы (2)


В документации сказано, что ручное связывание предпочтительнее, чем DBRef.

http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-SimpleDirect%2FManualLinking

person deltanovember    schedule 22.05.2012
comment
См. принятый ответ на stackoverflow. ком/вопросы/10148308/. Популяция мангустов не использует DBRef. - person TaylorMac; 10.03.2014

story.fans — это массив objectid. objectids не может иметь оценок. Вам нужно добавить рейтинг в схему Person вместо схемы истории.

var PersonSchema = new Schema({
    name    : String
    , age     : Number
    , rating: Number
    , stories : [{ type: Schema.ObjectId, ref: 'Story' }]
});
person aaronheckmann    schedule 25.05.2012
comment
Но у человека нет рейтинга. Фанат дает оценку той или иной истории. Я думаю, что DBRef - неправильный путь, и ручное связывание - это путь. - person deltanovember; 27.05.2012