mongoose array push не сохраняет мои записи и игнорирует мое простое желание использовать push

#mongoose

#mongoose

Вопрос:

У меня есть две схемы:

     var optionsSchema = new Schema({
    locationname: String,
    locationnumber : String     
});

var Xoption = mongoose.model('Xoption', optionsSchema);

var estoreSchema = new Schema({
    user: String,
    odds: String,
    //options: [optionsSchema]
    options: [{ type: Schema.Types.ObjectId, ref: 'Xoption' }]
});

var Estore = mongoose.model('Estore', estoreSchema);


export default Estore;
export {  Xoption };
  

Обратите внимание, что параметры имеют [{тип: Схема.Типы.ObjectId, ref: ‘Xoption’}] поэтому он будет хранить идентификаторы объектов из коллекции xoptions.

Вот пример одного документа Estore:

   {
        "_id" : ObjectId("5f998198df1e7b7598ba307c"),
        "options" : [
                ObjectId("5f998198df1e7b7598ba307b")
        ],
        "user" : "two",
        "odds" : "two",
        "__v" : 0
}
  

Как вы можете видеть, массив опций содержит идентификаторы для коллекции Xoptions.
Теперь, когда я пытаюсь ввести другой идентификатор в массив параметров, я делаю следующее:
Я получаю идентификатор из модели Xoption. Чтобы упростить мой код здесь и увеличить относительную часть вопроса, я просто присваиваю его переменной:

  let getid = 'ObjectId("5f997d78ace0547ba8c05646")';   
  

Теперь мне нужно отправить этот идентификатор в массив опций в моем хранилище, поэтому я делаю следующее:

 Estore.findOne({ "odds": "two" }).then(doc => {
    console.log("xxx", doc.options);
    doc.options.push(getid);

}).catch(err => {
    console.log("error message :", err);
});
  

Когда я это делаю, я получаю сообщение об ошибке: ошибка приведения к ObjectId, и причина ошибки:

     reason:
   Error: Argument passed in must be a single String of 12 bytes or a string of 24 hex characters
  

Теперь я чего-то добиваюсь, поэтому я извлек ObjectId из переменной, я не получаю ошибки, но идентификатор не передается в массив параметров:

 let getid = '5f997d78ace0547ba8c05646';
  

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

Мой вопрос: как мне перенести значение этой переменной в массив параметров?

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

1. getid Действительно ли в допустимом формате? Что, если вы жестко getid закодируете с допустимым идентификатором объекта? Возможно, это не в этом месте? Немного сложно сказать, нигде не выглядит плохо.

2. Да, это действительно. Жесткий код getid не изменит проблему.

Ответ №1:

Проблема заключалась в сохранении модели после ее обновления. поэтому вместо этого:

 Estore.findOne({ "odds": "two" }).then(doc => {
console.log("xxx", doc.options);
doc.options.push(getid);

}).catch(err => {
    console.log("error message :", err);
});
  

Просто добавьте save после push ():

 doc.save()
  

Полный код должен быть:

  Estore.findOne({ "odds": "two" }).then(doc => {
    console.log("xxx", doc.options);
   doc.options.push(getid);
    doc.save();
}).catch(err => {
   console.log("error message :", err);
});
  

Кроме того, параметры: [{ тип: Схема.Типы.ObjectId, ref: ‘Xoption’ }] принимает ObjectId с 24-битными символами, вам не нужен ObjectId раньше, это должно быть так:

 let getid = '5f997d78ace0547ba8c05646';