当前位置: 首页 > 知识库问答 >
问题:

如何将type:(new Mongoose.Schema)实现为数组

祖利
2023-03-14

我在我的nodejs应用程序中有一个订单模型,需要在其中实现订单中的产品数量。

我已经将产品类型添加为(new mongoose.schema)并通过Joi对其进行验证,在本例中,我只能添加一个产品

以下是订单模型

const Order = mongoose.model('Order', new mongoose.Schema({
  Name: {
    type: String,
    required: true,
    minlength: 3,
    maxlength: 50
  },  
  OrderDate: {
    type: Date,
    default : Date.now
  },
  Address: {
    type: String,
    minlength: 3,
    maxlength: 50,
    required: true,
  },
  City: {
    type: String,
    minlength: 3,
    maxlength: 50,
    required: true,
  },
  Phone: {
    type:Number,
    required: true
  },
  Payment: {
    type:String,
    required: true
  },
  OrderPrice: {
    type:String,
    required: true
  },
  ShippingPrice:{
    type:Number
  },
  customer: {
    type: new mongoose.Schema({
      UserName: {
        type: String,
        required: true,
        minlength: 5,
        maxlength: 50
      },
      Email: {
        type: String,
        unique : true,
        required: true,
        minlength: 5,
        maxlength: 255
      },Phone: {
        type: Number,
        required: true,
        min :10 
      },
      Address: {
        type: String,
        required: true,
        minlength: 5,
        maxlength: 50
      }
    }),  
    required: true
  },
  product:
     {
    type: new mongoose.Schema({
    Pro_Name: {
      type: String,
      required: true,
      minlength: 5,
      maxlength: 50
    },
    Pro_Price: {
      type: Number,
      required: true
      },
    Pro_IMG: {
        type: String,
        minlength: 5,
        maxlength: 50
      },
    // Pro_Qty: {
    //   type: Number,
    //   min: 1
    //   }
    }),
    require: true
  }

  }));
function validateOrder(order) {
    const schema = {
      Name: Joi.string().min(3).required(),
      Address: Joi.string().required(),
      City: Joi.string().required(),
      Phone: Joi.number().required(),
      Payment: Joi.string().required(),
      OrderPrice: Joi.number().required(),
      customerID:Joi.objectId(),
      productID:Joi.objectId(),

    };

    return Joi.validate(order, schema);
  }

router.post('/', async(req, res)=>{     
    const {error} = validate(req.body);
    if (error) return res.status(404).send(error.details[0].message);

    const customer = await Customer.findById(req.body.customerID);
    if (!customer) return res.status(400).send('Invalid customer Pleas Login First.');

    const product = await Product.findById(req.body.productID);
    if (!product) return res.status(400).send('Invalid Product to be add in the cart');

    //create the new Product
    let newOrder = new Order({ 
        Name: req.body.Name,
        Address: req.body.Address,
        City: req.body.City,
        Phone: req.body.Phone,
        Payment: req.body.Payment,
        OrderPrice: req.body.OrderPrice,
        customer: {
            _id: customer.id,
            UserName: customer.UserName,
            Email:customer.Email,
            Phone:customer.Phone,
            Address:customer.Address
        },
        product: {
            _id: product.id,
            Pro_Name: product.Pro_Name,
            Pro_Price:product.Pro_Price,
            Pro_IMG:product.Pro_IMG
        }
    });

    // try{
    //     new Fawn.Task()
    //       .save('orders' , newOrder)
    //       .update('product' , {_id:Product._id},{
    //         $inc: {numberInStock : -1 }
    //       })
    //       .run();
    //     res.send(newOrder);
    //   }
    //    catch(ex){
    //      res.status(500).send('Somthing bad has happend -_-.')
    //    }


    newOrder = await newOrder.save();

    res.send(newOrder);
});


{
    "Name": "Hend Mohammed",
    "Address": "This is Forth adress",
    "City": "Giza",
    "Phone": 12345689,
    "Payment": "By HEND ^_^ With products and data a bout the customer",
    "OrderPrice": 50000,
    "customerID":"5cb18f625a9de34582475b22",
    "productID" :"5ca11d5f9456812c79d21be6"
}

{
    "_id": "5cb1a3b7c05d72523925bbac",
    "Name": "Hend Mohammed",
    "Address": "This is Forth adress",
    "City": "Giza",
    "Phone": 12345689,
    "Payment": "By HEND ^_^ With products and data a bout the customer",
    "OrderPrice": "50000",
    "customer": {
        "_id": "5cb18f625a9de34582475b22",
        "UserName": "heba Mohammed",
        "Email": "hebs47852@gmail.com",
        "Phone": 12345678910,
        "Address": "1235Adress"
    },
    "product": {
        "_id": "5ca11d5f9456812c79d21be6",
        "Pro_Name": "Cake updated",
        "Pro_Price": 100,
        "Pro_IMG": "Cake Image"
    },
    "OrderDate": "2019-04-13T08:54:15.994Z",
    "__v": 0
}

这允许我添加一个产品,但我需要添加多个产品在订单中

共有1个答案

鞠边浩
2023-03-14

如下定义,创建新的对象模式ProductSchema

const productSchema = new mongoose.Schema({
    Pro_Name: {
      type: String,
      required: true,
      minlength: 5,
      maxlength: 50
    },
    Pro_Price: {
      type: Number,
      required: true
      },
    Pro_IMG: {
        type: String,
        minlength: 5,
        maxlength: 50
      }
});

将此方案分配到您的orderschemaproduct中。

const model = new mongoose.Schema({
  Product: [productSchema] <-- it will be as a array of objects
});
const Order = mongoose.model("Order", model);

然后Product将充当一个对象数组来存储多个产品。

 类似资料:
  • 这个问题是关于当用户将数据输入Number类型的输入时限制/验证输入。 我的问题是,当模型第一次加载时,任何整数或1dp的数字都只能用1dp呈现。例40或40.0都显示为40.0(而不是40.00)。 仅供参考,注释的呈现行不工作(错误:未识别setAttribute)-这是一个独立于平台的尝试。 所以问题是:我如何得到输入以2dps呈现其初始值?

  • 我正在与来自不同项目的不同人员在线工作,他们负责后端API webservice。通常我在发送和接收JSON方面没有问题,但这次,我似乎无法正确地将JSON发送到服务器。 通常我使用Alamofire来接收和发送JSON消息,通常的调用如下: 但这一次,我得到了后端程序员要求我使用OAuthV2的项目。假设我已经开发了一个函数,它已经负责获取访问令牌字符串。该函数现在变成如下所示: 但结果不是40

  • 问题内容: (这是一个Q /A风格的问题,是提出类似问题的人们的首选资源。很多人似乎迷失了最佳方法,因为他们不知道所有选择许多答案将特定于ASP.NET,但是AJAX和其他技术在其他框架中确实具有等效功能,例如socket.io和SignalR。) 我有一个在ASP.NET中实现的数据表。我想在页面上实时或接近实时显示对此基础数据的更改。我该怎么办? 我的模特: 代替此示例的实际数据库,我将把数据

  • 问题内容: 当实现像队列这样的FIFO时,我的教练总是建议我们将其表示为圆形数组,而不是常规数组。为什么? 是因为在后者中,我们最终将在数组中包含垃圾数据吗? 问题答案: 如果您使用固定数量的Array-Slots / Elements,则以循环方式回收插槽比较容易,因为您不需要重新排列Elements的顺序。每当第一个Element以类似Array的方式移除时,您都必须将剩余的Elements向

  • 问题内容: 我有一堂这样的课。 我这样绝望。 我的输出在小提琴手上看起来像这样(字符串sc) 但是我收到错误消息:无法将当前的JSON数组(例如[1,2,3])反序列化为这些代码中的错误类型。 谢谢 。 问题答案: 看起来该字符串包含其中包含单个对象的数组。如果从输入的两端删除方括号,则应该能够将数据反序列化为单个对象: 您也可以将数组反序列化为对象列表,然后将对象从索引零处取出。