【问题标题】:findOneAndUpdate document with array带数组的 findOneAndUpdate 文档
【发布时间】:2020-05-21 11:45:42
【问题描述】:

这里有两个问题。

  1. 当存在数组时,findOneAndUpdate 的正确方法是什么?以下示例出现 err MongooseError [CastError]: Cast to embedded failed for value 错误。
  2. 您应该将对象数组变成单独的集合吗?

* 示例 *

var ProductSchema = new Schema({
  _id: Schema.Types.ObjectId,
  product_name: String
});

var purchaseOrderSchema = new Schema(
  {
    purchaseOrderNo: Number,
    products: [ProductSchema]
  }
);

const purchaseOrder = new PurchaseOrder(req.body);

PurchaseOrder.findOneAndUpdate(
  { _id: req.body._id },
  {
    $set: req.body,
    $push: req.body.products
  },
  { upsert: true, new: true }
)
.then((result) => {
  console.log('result', result);
  res.status(200).json(result);
})
.catch((err) => {
  console.log('err', err);
  res.status(500).json({ error: err });
});


const body = {
  _id: 'skjdhflksjdf',
  purchaseOrderNo: 1,
  products: [
    {
      _id: '111',
      product_name: 'Cup'
    },
    {
      _id: '222',
      product_name: 'Spoon'
    }
  ]
}

【问题讨论】:

  • 您是在尝试创建新的采购订单还是更新它,为什么行 const purchaseOrder = new PurchaseOrder(req.body)
  • 那是快递。对象是 req.body

标签: mongodb mongoose


【解决方案1】:

ProductSchematype_id 字段中设置为ObjectId。产品 id 111 和 222 不是有效的 ObjectId 并且无法转换。您可以将 ProductSchema_id 的类型更新为 Number 以使其正常工作

var ProductSchema = new Schema({
  _id: Number,
  product_name: String
});

【讨论】:

    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 2019-03-06
    • 2016-04-25
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    相关资源
    最近更新 更多