【问题标题】:Multiple populate include array of objects多个填充包含对象数组
【发布时间】:2023-02-01 11:17:02
【问题描述】:

我有 Mongoose orderSchema,它包括一个引用另一个集合的 user 字段和一个引用另一个集合的 address 字段以及一个对象数组 orderItems,每个对象都引用另一个集合

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
  userName: { type: String, required: true },
  phoneNumber: { type: Number, required: true },
});

const AddressSchema = new mongoose.Schema({
  street: { type: String, required: true },
  city: { type: String, required: true },
  state: { type: String, required: true },
  zipCode: { type: String, required: true },
});

const ItemSchema = new mongoose.Schema({
  name: { type: String, required: true },
  price: { type: Number, required: true },
});

const OrderSchema = new mongoose.Schema({
  oderNo: { type: No, required: true },
  user: { type: mongoose.Schema.Types.ObjectId, ref: 'User' },
  address: { type: mongoose.Schema.Types.ObjectId, ref: 'Address' },
  orderItems: [
    {
      item: { type: mongoose.Schema.Types.ObjectId, ref: 'Item' },
      quantity: { type: Number, required: true },
    },
  ],
});

const User = mongoose.model('User', UserSchema);
const Address = mongoose.model('Address', AddressSchema);
const Item = mongoose.model('Item', ItemSchema);
const Order = mongoose.model('Order', OrderSchema);

module.exports = {
  User,
  Address,
  Item,
  Order,
};

如何使用 Express.js 实现路由器来查找所有订单?

我下面给出的版本不起作用

const { Order } = require('path/to/your/models');

    const orders = await Order.find().populate('user address orderItems.item');
    res.render('orders', { orders });

我需要在 orders.ejs 中使用订单数据

`

<% if (orders) { %>
  <h2>Orders</h2>
  <% for (const order of orders) { %>
    <h3>Order Details</h3>
    <p>Order Number: <%= order.orderNo %></p>
    <p>User Name: <%= order.user.userName %></p>
    <p>Phone Number: <%= order.user.phoneNumber %></p>
    <p>Address: <%= order.address.street %>, <%= order.address.city %>, <%= order.address.state %>, <%= order.address.zipCode %></p>
    <h4>Order Items:</h4>
    <ul>
      <% for (const orderItem of order.orderItems) { %>
        <li><%= orderItem.item.name %>, <%= orderItem.quantity%></li>
      <% } %>
    </ul>
  <% } %>
<% } else { %>
  <p>Orders not found.</p>
<% } %>

错误:

无法读取未定义的属性(读取“街道”)

无法阅读 :

<%= order.user.userName %>
<%= orderItem.item.name %>
<%= order.address.street %>
<%= order.address.city %>
<%= order.address.state %>
<%= order.address.zipCode %></p>

我检查了数据库,字段和对象 ID 没有问题

【问题讨论】:

    标签: node.js express mongoose mongoose-schema mongoose-populate


    【解决方案1】:

    该错误可能是因为您尝试从填充数据访问的值可能不存在于某些订单中。为避免这些错误,您可以添加检查以确保在尝试在模板中访问值之前已定义这些值。

    尝试这个 :

    <% if (orders) { %>
      <h2>Orders</h2>
      <% for (const order of orders) { %>
        <h3>Order Details</h3>
        <p>Order Number: <%= order.orderNo %></p>
        <% if (order.user) { %>
          <p>User Name: <%= order.user.userName %></p>
          <p>Phone Number: <%= order.user.phoneNumber %></p>
        <% } %>
        <% if (order.address) { %>
          <p>Address: <%= order.address.street %>, <%= order.address.city %>, <%= order.address.state %>, <%= order.address.zipCode %></p>
        <% } %>
        <h4>Order Items:</h4>
        <ul>
          <% for (const orderItem of order.orderItems) { %>
            <% if (orderItem.item) { %>
              <li><%= orderItem.item.name %>, <%= orderItem.quantity%></li>
            <% } %>
          <% } %>
        </ul>
      <% } %>
    <% } else { %>
      <p>Orders not found.</p>
    <% } %>
    

    【讨论】:

      猜你喜欢
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-10
      • 2013-01-08
      • 2020-10-30
      相关资源
      最近更新 更多