Мангуст: метод findByIdAndUpdate не обновляется и не вставляется

#node.js #mongoose #mongoose-schema

#node.js #мангуст #мангуст-схема

Вопрос:

Метод findByIdAndUpdate должен обновлять или вставлять объект в БД, но он ничего не делает. Также он не выдает сообщение об ошибке или что-то в этом роде.

Я также пробовал это с исходным идентификатором объекта в качестве поля _id, но тоже не работает.

Кто-нибудь знает, чего не хватает для обновления или вставки объекта в БД?

 const schema = new Schema({
    _id: {
        type: Number,
        required: true
    },
    name: {
        type: String,
        required: true
    }
}, { toJSON: { virtuals: true } });

const myJson = {
    "myobject": {
    "_id": 781586495786495,
    "name": "MyName"
  }
}
const MyModel = mongoose.model('MyModel', schema);
MyModel.findByIdAndUpdate(myJson.myobject._id, myJson.myobject, { upsert: true });
  

Комментарии:

1. Попробуйте это: MyModel.findByIdAndUpdate(ObjectId(myJson.myobject._id), myJson.myobject, { upsert: true });

2. Не работает: приложение выдает ошибку: ReferenceError: Схема не определена. Также пробовал это со схемой. Типы.Число.

3. Вам нужно: const Mongoose = require('mongoose'); const Schema = Mongoose.Schema; Кроме того, почему вы сохраняете свой _id в схеме, вам это не нужно, поскольку это идентификатор mongo.

4. Этот фрагмент не включает в себя инструкции require, чтобы сохранить его бережливым, но в фактическом коде эти инструкции включены.

5. Я не позволяю Mongo генерировать поле _id, потому что я получаю уникальный ключ из объекта json.

Ответ №1:

Я использовал ваш код, и он действительно работает так, как задумано. Причина, по которой он не возвращает никаких ошибок и ничего не делает, может заключаться в том, что вы не подключены к базе данных во время выполнения операции над моделью.

Пожалуйста, рассмотрите следующий фрагмент, у меня это сработало.

 mongoose.connect('mongodb://localhost:27017/testingcollection').then(() => {
   const schema = new mongoose.Schema({
      _id: {
            type: Number,
          required: true
      },
      name: {
          type: String,
          required: true
      }
   }, { toJSON: { virtuals: true } });

   const myJson = {
      "myobject": {
      "_id": 781586495786495,
      "name": "MyName"
    }
     };

   const MyModel = mongoose.model('MyModel', schema);
   MyModel.findByIdAndUpdate(myJson.myobject._id, myJson.myobject, { upsert: true }).then(obj => {
      mongoose.connection.close();
   });
});
  

Комментарии:

1. Этот вызов возвращает только запрос A.findByIdAndUpdate(идентификатор, обновление, параметры) // возвращает запрос

2. Но этот выполняет его: A.findByIdAndUpdate (идентификатор, обновление, параметры, обратный вызов)