Прошу прощения, если это серьезный вопрос, я уже несколько часов ищу в Google и Stack, и мне нужно спросить!
У меня есть две схемы, User и Story, показанные ниже. Я пытаюсь ссылаться на пользователя для истории, используя опцию Ref для заполнения в запросе - я использовал mySQL раньше и поэтому хотел попытаться воспроизвести оператор JOIN. Всякий раз, когда я пытаюсь использовать заполнение, я просто получаю возвращаемый objectID или null (как показано ниже).
Изменено 12 ноября: исправлены жестко заданные идентификаторы и добавлены данные консоли
story-schema.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
User = require('./user-schema');
var StorySchema = new Schema({
title: { type: String, required: true },
author_id: { type: Schema.Types.ObjectId, ref: 'User' },
summary: { type: String, required: true },
rating: { type: String, required: true }
});
module.exports = mongoose.model('Story', StorySchema, 'stories');
user-schema.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var UserSchema = new Schema({
username: { type: String, required: true, index: { unique: true } },
is_admin: {type: Boolean, required: true, default: false }
});
сохранить - идентификатор жестко задан, например
app.post('/api/new_story', function(req, res){
var story;
story = new Story({
title: req.body.title,
author_id: mongoose.Types.ObjectId(req.params._id),
/* ex of req.params._id: 527fc8ff241cdb8c09000003*/
summary: req.body.summary,
rating: req.body.rating
});
story.save(function(err) {
if (!err) {
return console.log("created");
} else {
return console.log(err);
}
});
return res.send(story);
});
пример пользователя при входе в терминал
{
"__v" : 0,
"_id" : ObjectId("527fc8ff241cdb8c09000003"),
"is_admin" : false,
"username" : "ted"
}
пример истории при входе в терминал
{
"title" : "Test Story",
"author_id" : "527fc8ff241cdb8c09000003",
"summary" : "Test summary",
"rating" : "12",
"_id" : ObjectId("52827692496c16070b000002"),
"__v" : 0
}
запросы
//other mongoose/app includes above
User = require('./config/schema/user-model'),
Story = require('./config/schema/story-model');
// data.author_id = 527fc8ff241cdb8c09000003
// data.author_id.username = undefined
app.get('/api/query/:id', function (req, res){
return Story.findOne({_id:req.params.id})
.populate( { path: 'User' } )
.exec(function (err, data) {
console.log(data.author_id);
console.log(data.author_id.username);
if (err) {
return res.json({error:err})
}
})
});
// data.author_id = null
app.get('/api/query2/:id', function (req, res){
return Story.findOne({_id:req.params.id}) //_id hardcoded for example
.populate( 'author_id' )
.exec(function (err, data) {
console.log(data.author_id);
if (err) {
return res.json({error:err})
}
})
});
В первом запросе я получаю author_id, который я уже сохранил, что имеет смысл, поскольку это то, что я сохранил, но я получаю доступ к имени пользователя.
Во втором запросе я даже не могу получить доступ к author_id, который я уже сохранил.
Изменить: я могу нормально выполнить обычный запрос GET без "заполнить"
Что бы я хотел сделать
Возможность получить доступ к информации об авторе из рассказа - это больше похоже на доказательство концепции. В конце концов, я хотел бы сослаться на Story _id в модели User, поскольку для пользователя может быть много историй, но только один пользователь на историю, но я подумал, что сначала начну с этого.