Mongoose/Mongo:更新不保存

Posted

技术标签:

【中文标题】Mongoose/Mongo:更新不保存【英文标题】:Mongoose/Mongo: Update Not Saving 【发布时间】:2017-12-07 11:08:11 【问题描述】:

我对 mongo/mongoose 遇到的这个问题感到非常困惑。我实际上是在尝试获取产品数组,从数组中删除某个产品,然后使用省略所选产品的新数组更新购物图表。这是我正在处理的代码的 sn-p:

const remove = (req, res, next) => 
  console.log('here is the product id ' + req.body.cart.product)
  delete req.body._owner // disallow owner reassignment.
  Cart.find(_id: req.user.cartId)
  .then((products1) => 
    console.log("array of products: " + products1[0].product)
    const index = products1[0].product.indexOf(req.body.cart.product)
    console.log("index valeu: " + index)
    if (index > -1) 
      products1[0].product.splice(index, 1)
      return products1[0].product
    
    return products1[0].product
  )
  .then((products2) => 
    console.log('Second Promise Input: ' + products2)
    Cart.update(_id: req.user.cartId, $set: product: products2)
  )
  .then(() => res.sendStatus(204))
  .catch(next)
  

这是我服务器的输出:

Server listening on port 4741
here is the product id 5952b57ea52d092b8d34c6b0
array of products: 5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0
index valeu: 0
Second Promise Input: 5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0,5952b57ea52d092b8d34c6b0
PATCH /carts-decrease/595b037e128cfd37e0c864d7 204 38.773 ms 

根据我的 console.logs,我得到了我想要的数组,但它根本不会用新数组更新购物车。我已经盯着这段代码太久了,我很感激第二次关注这个。谢谢。

附:忽略产品ID都相同的事实,它只是一个测试变量

购物车架构:

'use strict'

const mongoose = require('mongoose')

const cartSchema = new mongoose.Schema(
  product: 
    type: Array,
    required: false
  ,
  owner: 
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
    required: false
  
, 
  timestamps: true,
  toJSON: 
    virtuals: true,
    transform: function (doc, ret, options) 
      const userId = (options.user && options.user._id) || false
      ret.editable = userId && userId.equals(doc._owner)
      return ret
    
  
)

const Cart = mongoose.model('Cart', cartSchema)

module.exports = Cart

产品架构:

'use strict'

const mongoose = require('mongoose')

const productSchema = new mongoose.Schema(
  name: 
    type: String,
    required: true
  ,
  price: 
    type: Number,
    required: true
  ,
  description: 
    type: String,
    required: true
  
, 
  toJSON: 
    virtuals: true
  
)

const Product = mongoose.model('Product', productSchema)

module.exports = Product

显示请求:

const show = (req, res) => 
  const product = 
  product.array = []
//  console.log(req.cart.product)
  const promises = []

  Promise.all(req.cart.product.map(function (id) 
    return Product.find(_id: ObjectId(id))
  )).then(function (products) 
    console.log(products)
    req.cart.product = products
    return res.json(
      cart: req.cart.toJSON(virtuals: true, user: req.user)
    )
  ).catch(function (err) 
    console.log(err)
    return res.sendStatus(500)
  )

【问题讨论】:

阅读 MongoDB 文档中的$pull 但不会从数组中删除该产品 ID 的所有实例?我正在尝试删除可能在数组中多次出现的特定产品 ID。 @NeilLunn 我尝试使用 pull 并删除该产品 ID 的每个实例。我记得你在大约一周前帮助我解决了与承诺相关的类似问题。这就是我上面的代码中发生的事情吗? $pull 运算符接受查询并确实删除了所有匹配的实例,就像文档中所说的那样。但是您正在从数组中“拉”一个ObjectId 值。它们都是“唯一的”,所以如果你只是应用 :"one" 你需要从数组中删除,那么这就是将被删除的全部内容。 【参考方案1】:

我建议你稍微修改一下你的cartSchema,并以embedded documents数组的形式存储产品:

const cartSchema = new mongoose.Schema(
    products: [
        name:  type: String ,
        price:  type: Number 
        ...
    ]
    ...
);

如果您这样做,您可以简单地使用 $pull 更新运算符从您的购物车中删除产品:

 $pull:  <field1>: <value|condition>, <field2>: <value|condition>, ...  

在您的情况下,查询应如下所示:

Cart.update(
     _id: req.user.cartId ,
     $pull:  products:  '_id': req.body.cart.product  
);

由于嵌入的文档将有自己的 ObjectId,因此只有一个文档与查询匹配。

【讨论】:

@sam-d 这对你有帮助吗? 但不会从数组中删除该产品 ID 的所有实例?我正在尝试删除可能在数组中多次出现的特定产品 ID 或者我应该先拉动然后设置?这可能会解决问题 它应该可以与 $pull 一起正常工作。确实,它会删除与查询匹配的所有实例。但是,如果我的架构正确,那么购物车的产品应该是一组嵌入式文档。因此,它们应该有一个 ObjectId(它是唯一的),因此应该只有一个匹配项。如果它们不是嵌入文档的数组,我建议重构。如果您可以发布您的购物车架构也会很有帮助,然后我可以给您一个更准确的答案/示例。 在上面加了^^

以上是关于Mongoose/Mongo:更新不保存的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 返回的模型无法更新

Mongoose 返回的模型无法更新

mongoose - 数据关系模型

Mongoose:使用 _id 以外的字段填充路径

如何从 GridFS 中的块和文件中删除文件?

????????????????