2016-01-29 4 views
1

У меня есть 2 документа «Пользовательский документ» и «Пользовательский документ». Это должно быть как отношение «один ко многим».Как заполнить детей в схеме MongoDB с использованием Mongoose

user.model.js

var UserSchema = new Schema({ 


    username: { 

     type: String, 
     unique: true, 
     required: true 

    }, 
    email: { 

     type: String, 
     unique: true, 
     required: true 
    }, 

    password: { 

     type: String, 
     required: true 
    }, 

    active: { 
     type: Boolean, 
     default: false, 
    }, 

    tokens: [{ 
     type: Schema.ObjectId, 
     ref: 'UserToken' 
    }], 


}); 

module.exports = mongoose.model('User', UserSchema); 

usertoken.model.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var UserTokenSchema = new Schema({ 

    type: { 
     type: String 
    }, 

    token: { 
     type: String 
    }, 

    expiry: { 
     type: Date, 
     default: null 
    }, 

    user: [{ 
     type: Schema.ObjectId, 
     ref: 'User' 
    }] 


}); 


module.exports = mongoose.model('UserToken', UserTokenSchema); 

user.controller

var user = new User({ 

     username: input.username, 
     email: input.email, 
     password: input.password, 
     active: false 

}); 


user.save(function(err) { 

     var userToken = new UserToken({ 

      type: 'new', 
      token: token, 
      expiry: null, 
      user: user._id 



     userToken.save(function(err) { 

     }) 
}) 

Втч en i отображает пользователя, он должен заполнять/извлекать все токены, связанные с этим пользователем. На данный момент он этого не делает.

Запрос

User.find({}) 
    .populate('tokens') 
    .exec(function(err, users) { 

    if(err) return res.json({success: 'false', errors: err}); 

    return res.json(users); 

}); 

данных

[ 
    { 
    username: "TestUser", 
    email: "[email protected]", 
    password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG", 
    _id: "56ab4bbfa8f3e11813803566", 
    __v: 0, 
    tokens: [ ], 
    active: false 
    } 
] 

Это, однако получение связанного пользователя, когда я отобразить маркер.

Запрос

UserToken.find({}) 
     .populate('user') 
     .exec(function(err, tokens) { 

    if(err) return res.json({success: 'false', errors: err}); 

    return res.json(tokens); 


}); 

данных

[ 


    { 
    type: "new", 
    token: "16c72da8-78a7-4ee1-9b03-f5e490d7e010", 
    _id: "56ab4bbfa8f3e11813803567", 
    __v: 0, 
    user: [ 
    { 
    username: "TestUser", 
    email: "[email protected]", 
    password: "$2a$10$I4wJ.e3eVK7EMcfdf46x0e5kYnSTzHPTcBmzXIctduM./pZEiGbPG", 
    _id: "56ab4bbfa8f3e11813803566", 
    __v: 0, 
    tokens: [ ], 
    active: false 
    } 
    ], 
    expiry: null 
    } 
] 

Как я могу получить пользователю все связанные с ним маркеры?

ответ

0

Это должно быть как отношение 1-ко-многим.

Почувствовав, что в вашем решении вы моделирования N к N отношения с:

var UserSchema = new Schema({ 
    tokens: [{ 
     type: Schema.ObjectId, 
     ref: 'UserToken' 
    }] 
... 


var UserTokenSchema = new Schema({ 
    user: [{ 
     type: Schema.ObjectId, 
     ref: 'User' 
    }] 
... 

Помимо, как вы вставляя данные в вашей БД? Помните, что не будут никаких рамок понимания отношений и вы должны это сделать вручную (обновление рефов каждый раз, когда вы создаете новый документ) К примеру

var u1 = { ... } 
Users.create(u1, function(err, user) { 
    UserTokens.findAndUpdate(userTokenId, {user: user._id}, function(err, uToken){ 
    // now userToken has the reference to your new user (u1) 
    }) 
}) 
+0

Ive обновил мой оригинальный вопрос, чтобы показать U как им создать пользователь и токен пользователя в моем пользовательском контроллере. Не могли бы вы показать мне правильный способ сделать отношения 1-N в схеме. –

+1

Я понимаю, что вы сейчас имеете в виду, я должен сначала создать маркер, а затем установить идентификатор маркера внутри массива user.tokens. –

+1

Но что, если что-то пойдет не так во время создания пользователя, как если бы посылка электронной почты не удалась. Если его линейный i cn't вернется к тому, когда пользователь не был создан без ручного удаления всего, что я создал. –

Смежные вопросы