Mongoose / Mongo:更新不保存

时间:2017-07-04 06:10:44

标签: arrays node.js mongodb mongoose promise

我对mongo / mongoose这个问题感到非常困惑。我本质上是尝试获取一系列产品,从阵列中删除某个产品,然后使用省略所选产品的新阵列更新购物图表。这是我正在处理的代码片段:

if ( Selection < 0) or (Selection > 3):

这是我服务器的输出:

while (Selection != 4):

根据我的console.logs,我正在按照我想要的方式获取阵列,但它根本不会使用新阵列更新购物车。我已经盯着这段代码太久了,我很欣赏第二眼。感谢。

P.S。忽略产品ID都是相同的事实,它只是一个测试变量

购物车架构:

while True:

产品架构:

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 

1 个答案:

答案 0 :(得分:0)

我建议您稍微修改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,因此只有一个文档与查询匹配。