【问题标题】:Mongoose/Mongo: Update Not SavingMongoose/Mongo:更新不保存
【发布时间】: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" 你需要从数组中删除,那么这就是将被删除的全部内容。

标签: arrays node.js mongodb mongoose promise


【解决方案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(它是唯一的),因此应该只有一个匹配项。如果它们不是嵌入文档的数组,我建议重构。如果您可以发布您的购物车架构也会很有帮助,然后我可以给您一个更准确的答案/示例。
  • 在上面加了^^
猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2018-12-22
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多