2016-01-25 3 views
1

Я новичок в mongoose и nodejs. Пожалуйста, помогите мне понять, что не так в моем коде при сохранении коллекции. Мой user.js выглядит, как показано нижеMongoose objectId не сохраняется в другой коллекции

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var bcrypt = require('bcrypt-nodejs'); 

var UserSchema = new Schema ({ 
name: { type: String, required: true }, 
username:{ type:String, required: true, index:{ unique: true}}, 
password:{ type: String, required: true, select: false}, 
email:{ type: String, required: true, select: true}, 
mobile:{ type: String, required: true, select: true}, 
nativecid:{ type: Schema.Types.ObjectId, ref:'City'}, 
regdate:{ type: Date, default: Date.now }, 
did:{ type: String, required: false } 
}); 

UserSchema.pre('save', function(next){ 

var user = this; 

if(!user.isModified('password')) return next(); 
bcrypt.hash(user.password, null, null, function(err, hash){ 
if(err) return next(err); 
user.password = hash; 
next(); 
}); 
}); 

UserSchema.methods.comparePassword = function(password){ 
var user = this; 
return bcrypt.compareSync(password, user.password); 
}; 

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

И мой Город модель т.е. city.js выглядит, как показано ниже

var mongoose = require('mongoose'); 

var Schema = mongoose.Schema; 

var CitySchema = new Schema({ 
name: { type: String, required: true }, 
status: { type: Boolean, default: true }, 
date: { type: Date, default: Date.now } 
}); 

module.exports = mongoose.model('City', CitySchema); 

Город уже хранится в базе данных, как показано ниже

{ "_id" : ObjectId("56a4a0adb0f445561cfd4e37"), "name" : "New York", "date" : ISODate("2016-01-24T10:00:13.220Z"), "status" : 1, "__v" : 0 } 

Я хочу это ObjectId of New York должен быть сохранен в пользовательской коллекции при регистрации пользователей. Я стараюсь, как показано ниже, но не получается.

var User = require('../models/user'); 
var City = require('../models/city'); 

api.post('/signup', function(req, res){ 

    var user = new User({ 
     name: req.body.name, 
     username: req.body.username, 
     password: req.body.password, 
     email: req.body.email, 
     mobile: req.body.mobile 
    }); 
    City 
     .findOne({ name: "New York" }) 
     .populate('_id') 
     .exec(function (err, city1) { 
     if(err){ 
      res.send(err); 
      return; 
     } 
     console.log('The creator is %s', city1.name); 
     return user.nativecid = city1._id; 

    }) 

    user.save(function(err){ 
     if(err){ 
      res.send(err); 
      return; 
     } 

     res.json({ 
      success: true, 
      message: 'User created successfully!' 
     }); 
    }); 
}); 

Я не понимаю, что не так. Пожалуйста, посоветуйте мне.

+0

Какое сообщение об ошибке отображается? –

ответ

0

Просто сохранить пользователь в city.findOne (вложенный) и не может быть никакой необходимости заселить вы должны использовать проекции.

City.findOne({ name: "New York" }, {name:1}) // ID return defaulat 
     .exec(function (err, city1) { 
     if(err){ 
      res.send(err); 
      return; 
     } 
     console.log('The creator is %s', city1.name); 
     user.nativecid = city1._id; 

     user.save(function(err1){ 
      if(err1){ 
       res.send(err1); 
       return; 
      } 

      res.json({ 
       success: true, 
       message: 'User created successfully!' 
      }); 
     }); 

    }) 
+0

Большое спасибо за ваше замечательное предложение. Он начал работать после добавления кода. –

+0

Если этот код работоспособен, вы можете принять и проголосовать. :) –