Mon goose deep / nested Model.populate (), возвращающий 'Undefined' - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь использовать встроенный в Mon goose метод Model.populate() для объекта Post, чтобы 1) получить отзывы внутри этого объекта, затем 2) вложенную опцию populate:{} внутри, чтобы получить username свойство author review от ObjectId из User.

Я, вероятно, упускаю что-то действительно очевидное и простое, но 5i sh часов позже я не могу найти это. Я вижу, что исходный populate() получает ObjectId author от объекта Review в массиве внутри Post, но затем он не использует этот ObjectId для поиска username свойство этого User объекта, вместо этого он возвращает Undefined, поэтому троичный оператор в моем файле e js показывает имя пользователя: откат "Anonymous".

Любая помощь для того, что я отсутствует будет оценена.

Модель сообщения:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const postSchema = new Schema({
  title:String,
  price:Number,
  description:String,
  images: [
    {
      url: {
        type:String,
        default:'https://res.cloudinary.com/rgreenstreet/image/upload/v1578603203/surf_shop/post/149933_txhwtj.png'
      },
      public_id: String,
    }
  ],
  location: {
    formattedAddress:String,
    lat:Number,
    lng:Number
  },
  author:
    {
      type:Schema.Types.ObjectId,
      ref:'User'
    },
  reviews:[],
  averageRating:{
    type:Number,
    default:0
  }
});

module.exports = mongoose.model('Post',postSchema);

Модель обзора:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const reviewSchema = new Schema({
    body:String,
    rating:Number,
    author:
        {
            type:Schema.Types.ObjectId,
            ref:'User'
        }
});

module.exports = mongoose.model('Review',reviewSchema);

Модель пользователя:

const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');
const Schema = mongoose.Schema;

const userSchema = new Schema({
    username:String,
    email:String,
    image: {
        url: {
            type:String,
            default:'https://cdn.pixabay.com/photo/2015/10/05/22/37/blank-profile-picture-973460_960_720.png'
        },
        public_id: String
    },
    isAdmin:{
        type:Boolean,
        default:false
    }
});

userSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('User',userSchema);

"Показать" маршрут для Post:

        post = await Post.findById(req.params.id).populate({
            path:'review',
            options:{sort: {'_id':-1}},
            populate:{
                path:'author',
                model:'User'
            }
        });
        res.render('posts/show',{post, title: 'SurfShop - View '+post.title, page:'view_post' });

И в моем файле e js я пытаюсь заполнить в review.author.username:

<div class="review">
                <% post.reviews.forEach((review) => { %>
                    <p><%= review.body %> - <%= review.rating %> Stars<%= (review.author.username ? ' - '+review.author.username : ' - Anonymous') %></p>
                    <hr/>
                <% }); %>
            </div>

1 Ответ

0 голосов
/ 16 января 2020

Я нашел проблему. Моя модель и маршрут Post были настроены на встраивание новых объектов Review целиком в массив reviews[] в объекте Post (а также сохранение их отдельно в своей коллекции), а не только в ObjectId ссылаясь на объект Review.

Я не совсем понял документы первые несколько раз, как в основном утверждая:

, чтобы использовать .populate(), вы должны сохранить ссылка на другой документ в текущем документе через ObjectId вместо встраивания всего документа

Так как у меня был сохранен объект Review, а не только его ObjectId, вложенный * Вместо этого метод 1021 * пытался заглянуть в другую коллекцию через ObjectId, которого там не было само по себе (дайте мне знать или отредактировать, если это ясно как грязь), и не было нигде go.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...