我知道填充模式不是一个新问题,但是我遇到一些关于多个模式的逻辑问题。我正在使用
"mongoose": "^4.8.5",
"express": "^4.15.0",
我有一个含有咖啡因饮料的图案。当用户选择饮料时,我希望将该饮料分配给用户。
**如果在任何时候我遗漏了架构中的简单内容,请告诉我。这个项目是我对mongodb的介绍。
我正在阅读填充mongoose文档http://mongoosejs.com/docs/populate.html。
基本上,如果我要将饮料分配到列表中,看起来我想将它们添加为数组中的引用。这是我使用 caffeine_list
的方法const SelectedDrinks = require('./userDrinks');
const UserSchema = mongoose.Schema({
name: {
type: String
},
email: {
type: String,
required: true
},
username: {
type: String,
required: true
},
password: {
type: String,
required: true
},
caffeine_list: caffeine_list: [ // attempting to reference selected drinks
{
type: mongoose.Schema.Types.ObjectId,
ref: 'SelectedDrinks'
}
]
})
SelectedDrinks来自下面的架构。我在
下添加了对用户的引用作为创建者const User = require('./user');
let userDrinkSchema = new mongoose.Schema({
creator : {
type: mongoose.Schema.Types.ObjectId,
ref: 'User'
},
caffeine: Number,
mgFloz: Number,
name: String,
size: Number,
updated_at: {
type: Date,
default: Date.now()
}
});
这是我开始感到困惑的地方。我最初尝试填充但无法实现。如果这是正确的,请告诉我。
关于向用户添加所选饮料的任务,我使用了addToSet。我希望这会给我饮料信息。我做了我的设置....
const User = require('../../models/user');
const UserDrinks = require('../../models/userDrinks');
router.post('/addDrink', (req, res, next) => {
let newDrink = new UserDrinks({
creator: req.body.creator,
caffeine: req.body.caffeine,
mgFloz: req.body.mgFloz,
name: req.body.name,
size: req.body.size,
updated_at: req.body.updated_at
});
newDrink.save( (err) => {
if(err) {
res.send(err);
} else {
User.findOne({ _id: newDrink.creator}, (err, user) => {
user.caffeine_list.addToSet(newDrink)
user.save( function (err) {
if(err) {
console.log(err);
}else {
res.status(201).json(newDrink);
}
})
})
}
})
});
然而,在邮递员发帖后,我检查 caffeine_list ,结果是
"caffeine_list" : [
ObjectId("58d82a5ff2f85e3f21822ab5"),
ObjectId("58d82c15bfdaf03f853f3864")
],
理想情况下,我希望使用咖啡因信息传递一系列对象
"caffeine_list" : [
{
"creator": "58d6245cc02b0a0e6db8d257",
"caffeine": 412,
"mgFloz": 218.7,
"name": "1.95 Perfect Drink!",
"size": 42.93,
"updated_at": "2017-03-24T18:04:06.357Z"
}
]
答案 0 :(得分:1)
使用以下代码而不是findOne更改您的其他部分并保存使用更新
novalidate
答案 1 :(得分:0)
虽然我不确定这是最好的方法,但我确实发现这是给我一个我想要的结果。我不得不做两个小改动,我能够得到 caffeine_list 给我想要的回复
我必须访问所选饮品的架构
const SelectedDrinks = require('./userDrinks').schema; //** need schema
之后我能够改变
caffeine_list: [
{
type: mongoose.Schema.Types.ObjectId,
ref: 'UserDrinks' // name of the file
}
]
到
caffeine_list: [SelectedDrinks]
现在我有了架构,我可以将饮料直接添加到UserSchema上的 caffeine_list 。