Как сохранить данные в поддокументе в mongodb? Мой конвертирует поддокумент фермы в ноль - PullRequest
0 голосов
/ 17 июня 2019

Я сохраняю данные для фермы в User, но я пробовал много вещей, чтобы сохранить данные в поле фермы. Я создал API, который регистрирует пользователя и данные сохраняются, ферма является одним из ее объектов, я хочу добавить ферма после регистрации для этого конкретного пользователя. Недавно я попытался обновить, и мой код преобразует ферму в null. У пользователя может быть много ферм.

Я использую mongoose, express и паспорт для аутентификации. Я изменил ферму на Object, ObjectID, Array, но ничего не помогает, каждый раз ферма конвертируется в null. Моя схема верна?

Схема

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

//Device Schema
const Device = new Schema({

  modelNumber: {
    type: String,
    required: true
  },
  deviceType: {
    type: String,
    required: true
  },
  description:{
      type:String,
      required:false   
  },

  deviceLocation:[ 
    {
      latitude:Number,
      longitude:Number
    }
  ],

  AddedDate: {
    type: Date,
    default: Date.now
  },

});

// User Schema
const UserSchema = new Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true
  },
  location:{
      type:String,
      required:true
  },
  createdDate: {
    type: Date,
    default: Date.now
  },

  farm:[
      {
        _id:mongoose.Schema.Types.ObjectId,
        description:String,
        farmAddDate:{type:Date,default:Date.now},
        device:[{Device}]
     }
 ]   

});


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

Добавить API фермы

//@route POST api/user/addFarm
//@desc POST Register Farm
//@access Public  
addFarm=function (req,res){
  User.findOneAndUpdate({ farm: req.body.farm }).then(farm => {
    if (farm) {
      return res.status(400).json({ farm: "Farm already exists" });
    } else {
      const newFarm =  Farm({
       _id:req.body._id,
       description:req.body.description,
       device:req.body.device
      });
      newFarm
      .save()
      .then(farm => res.json(farm))
      .catch(err => console.log(err));
    }
  });
}
  router.post('/addFarm',addFarm);

Регистрация нового пользователя

router.post("/register", (req, res) => {
  // Form validation
  const { errors, isValid } = validateRegisterInput(req.body);
  // Check validation
  if (!isValid) {
    return res.status(400).json(errors);
  }

  User.findOne({ email: req.body.email }).then(user => {
    if (user) {
      return res.status(400).json({ email: "Email already exists" });
    } else {
      const newUser = new User({
        name: req.body.name,
        email: req.body.email,
        password: req.body.password,
        location:req.body.location,


      });

      // Hash password before saving in database
      bcrypt.genSalt(10, (err, salt) => {
        bcrypt.hash(newUser.password, salt, (err, hash) => {
          if (err) throw err;
          newUser.password = hash;
          newUser
            .save()
            .then(user => res.json(user))
            .catch(err => console.log(err));
        });
      });
    }
  });
});


Ошибка:

(узел: 7064) UnhandledPromiseRejectionWarning: CastError: сбой приведения к внедренному значению "\ 'DGR \'" в пути "ферма" на новом CastError (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ error \ cast.js: 29: 11) в DocumentArray.cast (C: \ Users \ Притам Кумар \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ schema \ documentarray.js: 402: 19) в DocumentArray.cast (C: \ Users \ Притам Кумар \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ schema \ documentarray.js: 336: 17) в DocumentArray.SchemaType.applySetters (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ schematype.js: 892: 12) в DocumentArray.SchemaType._castForQuery (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ schematype.js: 1304: 15) в DocumentArray.SchemaType.castForQueryWrapper (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ schematype.js: 1271: 17) at castUpdateVal (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ helpers \ query \ castUpdate.js: 434: 19) at walkUpdatePath (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ helpers \ query \ castUpdate.js: 261: 22) at castUpdate (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ helpers \ query \ castUpdate.js: 79: 18) at model.Query._castUpdate (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ query.js: 4319: 10) at castDoc (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ query.js: 4347: 18) at model.Query.Query._findAndModify (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ query.js: 3325: 19) на модель. Запрос. (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ query.js: 2902: 8) at model.Query._wrappedThunk [as _findOneAndUpdate] (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ mongoose \ lib \ helpers \ query \ wrapThunk.js: 16: 8) at process.nextTick (C: \ Users \ Pritam Kumar \ Documents \ Mern auth \ mern-auth-Sagita \ node_modules \ kareem \ index.js: 369: 33) at process._tickCallback (internal / process / next_tick.js: 61: 11) (узел: 7064) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо в результате выброса внутри асинхронной функции без блока catch, либо отклоняя обещание, которое не было обработано с помощью .catch (). (идентификатор отклонения: 1) (узел: 7064) [DEP0018] Предупреждение об устаревании: отклонение необработанного обещания устарело. В будущем отклонения обещаний, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения. (узел: 7064) DeprecationWarning: Mongoose: findOneAndUpdate() и findOneAndDelete() без параметра useFindAndModify, установленного в false, устарели. Смотри: https://mongoosejs.com/docs/deprecations.html#-findandmodify-

* * Тысяча двадцать-один O / P * * тысяча двадцать-два
id:5d034237a9a144428459a120
name:"Auditi"
email:"b@b.com"
password:"$2a$10$qHvr3VurbyvJyuqbV11NVeKLjn8jhTuP7piI5yMNBOLOQac98zcC2"
location:"XYZ"
createdDate:2019-06-14T06:44:07.035+00:00
farm:Array(data is saved)
__v:0

1 Ответ

0 голосов
/ 17 июня 2019
First of all, in the schema correct this:

     farm:[
          {
            description:String,
            farmAddDate:{type:Date,default:Date.now},
            device:[{Device}]
          }
      ]  

Не используйте _id в массиве фермы, _id - автоматически генерируемое поле, оно создается само при добавлении новой записи.Кроме того, вы не можете сравнить весь массив в записи.

User.findOneAndUpdate({ farm: req.body.farm }) 

Это неправильный подход, он никогда не вернет совпавшую запись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...