Заполнить в Mongoose не работает

Я пытаюсь выполнить ассоциации, ссылаясь на метод. Есть 2 модели: 1. Пользовательская 2. Товарная.

Я установил отношения один-к-одному: 1 пользователь может иметь несколько продуктов. Создание пользователя выполнено успешно Создание продукта выполнено успешно

Ввод кода

var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/product_demo_x9");

Схема продукта

var productSchema = new mongoose.Schema({
  category : String,
  Brand: String
});
var Product = mongoose.model("product", productSchema);

Схема пользователя

var userSchema = new mongoose.Schema({
email: String,
name: String,
products: [
  {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Product"
  }
]
});`
var User = mongoose.model("user", userSchema);

Создание пользователя

User.create({
  email: "[email protected]",
  name: "Maddy"
},function(err,newUser){
    if(err){
       console.log(err);
    }
    else {
       console.log(newUser);
    }
});

Создание продукта

Product.create({
    category: "Smartwatches",
    Brand: "Samsung and Google"
}, 
function(err,product){
    console.log(product);
    User.findOne({name : "Maddy"},function(err,foundUser){
        if(err) {
            console.log(err);
        }
        else {
            foundUser.products.push(product);
            foundUser.save(function(err,updatedUser){
                if(err){
                     console.log(err);
                }
                else {
                        console.log(updatedUser);
                    }
                });
            }
    });
});

Отображение связанных данных на консоли

User.find({email: "[email protected]"}).
populate("products").
exec(function(err,user){
    if(err){
        console.log(err);
    }
    else {
        console.log(user);
    }
});

Вывод кода

Создание пользователя (успех)

[{
  products: [],
  _id: 5a47acb0317d4e3c2081b8ce,
  email: '[email protected]',
  name: 'Maddy',
  __v: 0
}]

Создание продукта и связывание (Успех)

{
  _id: 5a47acd53c771123b4018ff1,
  category: 'Smartwatches_2',
  Brand: 'Samsung and Google',
  __v: 0
}
{
  products: [ 5a47acd53c771123b4018ff1 ],
  _id: 5a47acb0317d4e3c2081b8ce,
  email: '[email protected]',
  name: 'Maddy',
  __v: 1
}

Отображение встроенных данных с помощью заполнения - Ошибка !!

{ MissingSchemaError: Schema hasn't been registered for model "products".
Use mongoose.model(name, schema)
    at new MissingSchemaError

Кто-нибудь может объяснить мне, как это сделать правильно? Заранее спасибо


person Madhur Kukreja    schedule 30.12.2017    source источник


Ответы (3)


В названии модели учитывается регистр

'Product' не равно 'product', и когда вы создаете модель как 'product' (единственное число), она преобразует ее во множественное число, т.е. 'products', это поведение мангуста по умолчанию, его можно переопределить.

поэтому измените следующее:

var userSchema = new mongoose.Schema({
email: String,
name: String,
products: [
  {
    type: mongoose.Schema.Types.ObjectId,
    ref: "products" //<---- changed 'Product' to 'products'
  }
]
});`
var User = mongoose.model("user", userSchema);
person imixtron    schedule 30.12.2017

Попробуй это

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/product_demo_x9');

var productSchema = new mongoose.Schema({
    category: String,
    Brand: String
});
var Product = mongoose.model('Product', productSchema);

var userSchema = new mongoose.Schema({
email: String,
name: String,
products: [
    {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Product'
    }
]
});
var User = mongoose.model('User', userSchema);

User.create({
    email: '[email protected]',
    name: 'Maddy'
}, function(err, newUser) {
    if (err) {
        console.log(err);
    } else {
        console.log(newUser);
    }
});

Product.create({
        category: 'Smartwatches',
        Brand: 'Samsung and Google'
    },
    function(err, product) {
        console.log(product);
        User.findOne({name: 'Maddy'}, function(err, foundUser) {
            if (err) {
                console.log(err);
            } else {
                foundUser.products.push(product);
                foundUser.save(function(err, updatedUser) {
                    if (err) {
                        console.log(err);
                    } else {
                        console.log(updatedUser);
                    }
                });
            }
        });
    });

User.find({email: '[email protected]'})
    .populate('products')
    .exec(function(err, user) {
        if (err) {
            console.log(err);
        } else {
            console.log(user);
        }
    });
person Priidik Vaikla    schedule 30.12.2017
comment
Разве это не ссылка: ИМЯ МОДЕЛИ. Здесь название модели - Product. В любом случае, что вы предлагаете мне поставить перед ссылкой:? - person Madhur Kukreja; 30.12.2017
comment
Попробуйте поменять их на один и тот же регистр - person Priidik Vaikla; 30.12.2017
comment
Вайкала, да все равно безуспешно - person Madhur Kukreja; 31.12.2017
comment
Ошибка такая же? Этот код мне подходит. Тогда может случиться так, что модель продукта не загружается, пока вы пытаетесь заполнить. - person Priidik Vaikla; 01.01.2018

Решено Сделал следующее

  1. Понизил мою версию Mongoose с 5.00x до 4.10.8, используя следующую команду npm remove mongoose, затем npm install [email protected] --save

  2. В файл app.js внесены следующие изменения

    var userSchema = new mongoose.Schema({
    email: String,
    name: String,
    products: [
      {
        type: mongoose.Schema.Types.ObjectId,
        ref: "product" //<---- changed 'Product' to 'product'
      }
    ]
    });`
    var User = mongoose.model("user", userSchema);
    

Спасибо сообществу Stack за попытку!

person Madhur Kukreja    schedule 31.12.2017