Mon goose - Model.updateOne не работает для меня при добавлении внедренного документа в существующий документ - PullRequest
0 голосов
/ 20 марта 2020

Когда я запускаю этот код в node.js, мой встроенный идентификатор документа не совпадает со связанным идентификатором в другой коллекции.

const fruitSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    rating: {
        type: Number,
        min: 1,
        max: 10,
    },
    review: String
});

const Fruit = mongoose.model("Fruit", fruitSchema);

const watermelon = new Fruit({
    name: "Watermelon",
    rating: 7,
    review: "Meh."
});

// watermelon.save();

const personSchema = new mongoose.Schema({
    name: String,
    age: Number,
    favouriteFruit: fruitSchema
});

const Person = mongoose.model("Person", personSchema);

const person = new Person({
    name: "John",
    age: 37,
    favouriteFruit: watermelon
});

person.save();

В результате в MongoDB я получаю От метод. Я просто пытаюсь добавить внедренный документ в другой документ. Я просто новичок, поэтому любые ссылки или помощь будут потрясающими! Спасибо!

1 Ответ

0 голосов
/ 20 марта 2020

Почему такое поведение?
Причина, по которой вы имеете разные _id s в объекте двух фруктов, которые должны быть одинаковыми, заключается в том, что вы не добавили свойство _id в схема фрукта и поскольку _id является обязательным свойством всего документа MongoDB, mon goose поможет вам автоматически сгенерировать новый _id при создании запроса для отправки в базу данных. _id, который он генерирует при запуске watermelon.save(), отличается от _id, который он генерирует при запуске person.save(), поэтому вы видите два разных _id s.

Исправление:
Что вам нужно сделать, это добавить свойство _id к схеме фрукта (и, возможно, схему человека, чтобы избежать дальнейших сюрпризов), а затем явно сгенерировать _id ваше собственное перед тем, как сохранить документ в базу данных. Схема фруктов должна выглядеть следующим образом после добавления свойства _id:

const fruitSchema = new mongoose.Schema({
    _id: mongoose.ObjectId,
    name: {
        type: String,
        required: true
    },
    rating: {
        type: Number,
        min: 1,
        max: 10,
    },
    review: String
});

И при создании экземпляра модели фруктов добавьте значение _id самостоятельно:

const watermelon = new Fruit({
    _id: mongoose.Types.ObjectId(), // this helps generate a unique objectId
    name: "Watermelon",
    rating: 7,
    review: "Meh."
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...