猫鼬由ObjectId填充,其中模式中的ObjectId后面还有另一个属性

时间:2020-03-15 20:13:05

标签: node.js express mongoose

我有一个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的find语句包括一个populate()方法调用,该方法调用从理论上引入了实际的Post项目,因此我可以在页面上显示标题等:

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和{{1的_id数组}}值与我最初存储的值完全相同:

quantity

但是,我看到的关于cart: { _id: 5e6e884ffda1be0648ae1b99, items: [ { _id: 5e3435f9ab899a1dd8a4105e, quantity: 1 } ], __v: 1 } 的所有内容都只存储了对当前(购物车)文档中外来(post)文档的Mongoose.populate()的引用{em}不含ObjectId的其他属性。那是什么引起我的麻烦?如果是这样,如何链接quantityPostitems的数量?

1 个答案:

答案 0 :(得分:1)

您的填充不正确。

您的路径必须是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
}