#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';