如何在Mongoose的数组中填充ObjectId对象?

How to populate an ObjectId object within an array in Mongoose?

提问人:Alim Gölcük 提问时间:12/30/2022 更新时间:12/30/2022 访问量:149

问:

首先,我在 StackOverflow 中找到了很多关于该问题的答案,但是,它们都没有解决我的问题。

我有一个这样的userSchema:

const UserSchema = new Schema({
  userName: {
    type: String,
    required: true,
  },
  userSurname: {
    type: String,
    required: true,
  },
  userEmail: {
    type: String,
    unique: true,
    required: true,
  },
  userPassword: {
    type: String,
    required: true,
  },
  userRole: {
    type: String,
    enum: ['müşteri', 'admin'],
    default: 'müşteri',
  },
  userCart: [
    {
      productId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Product',
      },
     quantity: Number,
     price:Number,
      
    },
  ],
});

我想在userCart的数组中填充productId,这样我就可以访问:

const ProductSchema = new Schema({
  productName: {
    type: String,
    unique: true,
    required: true,
  },
  productBrand: {
    type: String,
    required: true,
  },
  productPrice: {
    type: String,
    required: true,
  },
  productPhoto: {
    type: String,
    required: true,
  },
  productQuantity: {
    type: Number,
    required: true,
  },
  slug: {
    type: String,
    unique: true,
  },
  category: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Category',
  },
});

这些字段。

我试过了

const products = await User.findById(req.session.userID).populate('userCart');

const products = await User.findById(req.session.userID).populate('userCart.productId');

我认为这可能是因为 findById,所以我尝试了 findOne 而不是 findById,但那个也没有用。

这样做之后,我试图像这样进入ejs文件,但它什么也没显示。

<% for(let i =0; i< products.userCart.length; i++) { %>
        <div>
            <%= products.userCart[i].productName %>
        </div>
        
        <% } %>

任何帮助都是值得赞赏的,提前致谢。

javascript node.js mongoose mongoose-populate

评论


答:

0赞 Dimitar Stojanovski 12/30/2022 #1

如果要填充架构,则必须在执行“查找”查询时对该架构执行 preQuery。

首先,我认为您必须更新您的 UserSchema。在 userSchema 定义中为您的 userCart 更新此内容:(尽量避免嵌套。

userCart: {
     type: mongoose.Schema.Types.ObjectId,
     ref: 'Product',
    },

然后,将此中间件查询添加到您的 userSchema:

//QUERY MIDDLEWARE
UserSchema.pre(/^find/, (next) => {
    this.populate({
        path:"userCart",
    });

    next();
});

此代码将被执行,并在 userSchema 的每个“查找”查询中填充该 productId 的数据。

如果您有任何问题或疑问,请告诉我。

评论

0赞 Alim Gölcük 12/30/2022
但是我需要那个“数量:数字”字段。此字段来自用户填写的输入。此外,userCart 必须是一个数组,因为它可能有多个 Product。@Dimitar斯托亚诺夫斯基
0赞 Alim Gölcük 12/30/2022
现在,ı 无法登录时,ı 将代码更改为该:) @DimitarStojanovski
0赞 Dimitar Stojanovski 12/30/2022
该价格字段肯定应该在您的产品架构中。
1赞 Dimitar Stojanovski 12/30/2022
也许最好为每个购物车设置另一个架构。请检查此示例。它是用 NestJs 编写的,但这是同一个问题。blog.logrocket.com/how-build-ecommerce-app-nestjs@AlimGölcük
0赞 Alim Gölcük 12/30/2022
我会的,谢谢你的努力@DimitarStojanovski