Mon goose заполнить ObjectId, где есть еще одно свойство после ObjectId в схеме - PullRequest
0 голосов
/ 15 марта 2020

У меня есть схема Cart, как определено ниже:

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

const cartSchema = new Schema({
    items:[
        {
            id:{
                type:Schema.Types.ObjectId,
                ref:'Post'
            },
            quantity:Number
        }
    ]
});

Схема ссылается на _id другой схемы Post в массиве items, а также на количество этот предмет в корзине. Мое утверждение поиска для Cart включает в себя вызов метода populate() для теоретического ввода фактического элемента Post, чтобы я мог показать заголовок и т. Д. c. на странице:

let cart;
if(!req.session.cartId) {
    req.session.error = 'There are no items currently in your cart';
    return res.redirect('/');
}
try {
    cart = await Cart.findById(req.session.cartId).populate({
        path:'item',
        model:'Post'
    }).exec();

Выход из блока catch, потому что я не верю, что это является частью проблемы. Я должен иметь возможность видеть документ Post вместо его ObjectId, и я мог делать такие вещи в других местах.

Оператор запускается и возвращает корзину, но он кажется, что вызов populate() игнорируется, и все, что я получаю, это массив items со значениями _id и quantity, точно такими же, как я их изначально сохранял:

cart: {
  _id: 5e6e884ffda1be0648ae1b99,
  items: [ { _id: 5e3435f9ab899a1dd8a4105e, quantity: 1 } ],
  __v: 1
}

Однако, все, что я вижу относительно Mongoose.populate(), хранит только ссылку на ObjectId внешнего (почтового) документа в текущем (корзине) документе без дополнительного свойства quantity. Это то, что вызывает у меня проблемы? Если это так, как я могу связать количество Post в items в Cart?

1 Ответ

1 голос
/ 16 марта 2020

Вы заполняете неправильно.

Ваш путь должен быть items.id вместо item, а модель должна быть реальной моделью, а не строкой, поэтому удалите одинарные кавычки и убедитесь, что вы импортируете его как const Post = require("../models/post");

 cart = await Cart.findById(req.session.cartId).populate({
        path:'items.id',
        model:Post
    }).exec();

Это даст вам такой результат:

{
    "_id": "5e6f2dd63d82e35988921907",
    "items": [
        {
            "_id": "5e6f2dd63d82e35988921909",
            "id": {
                "_id": "5e6f2da53d82e35988921905",
                "title": "Post 1 Title",
                "__v": 0
            },
            "quantity": 1
        },
        {
            "_id": "5e6f2dd63d82e35988921908",
            "id": {
                "_id": "5e6f2db13d82e35988921906",
                "title": "Post 2 Title",
                "__v": 0
            },
            "quantity": 2
        }
    ],
    "__v": 0
}

Результат выглядит немного некрасиво из-за поля id, его нелегко прочитать , Поэтому я советую переименовать поле items.id в items.post следующим образом:

const cartSchema = new Schema({
  items: [
    {
      post: {
        type: Schema.Types.ObjectId,
        ref: "Post"
      },
      quantity: Number
    }
  ]
});

и изменить путь заполнения на items.post, чтобы результат выглядел следующим образом:

{
    "_id": "5e6f2dd63d82e35988921907",
    "items": [
        {
            "_id": "5e6f2dd63d82e35988921909",
            "post": {
                "_id": "5e6f2da53d82e35988921905",
                "title": "Post 1 Title",
                "__v": 0
            },
            "quantity": 1
        },
        {
            "_id": "5e6f2dd63d82e35988921908",
            "post": {
                "_id": "5e6f2db13d82e35988921906",
                "title": "Post 2 Title",
                "__v": 0
            },
            "quantity": 2
        }
    ],
    "__v": 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...