使用addToSet在嵌套模式mongoose中添加一个项目

时间:2017-03-26 20:00:28

标签: node.js mongodb mongoose mongoose-populate

我知道填充模式不是一个新问题,但是我遇到一些关于多个模式的逻辑问题。我正在使用

"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"
    }
 ]

2 个答案:

答案 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