2017-07-04 96 views
1

我非常困惑这个问题,我与mongo /猫鼬。我本质上是试图获得一系列产品,从数组中删除某个产品,然后使用省略所选产品的新阵列更新购物图。这里的代码我处理的片段:猫鼬/蒙戈:更新不保存

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,我得到阵列只是我的方式想要它,但它不会使用新阵列更新购物车。我一直在盯着这段代码太久了,我会很欣赏这第二套眼睛。谢谢。

P.S.忽略一个事实,即产品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) 
    }) 
} 
+2

在MongoDB文档中阅读['$ pull'](https://docs.mongodb.com/manual/reference/operator/update/pull/)。 –

+0

但不会从数组中删除该产品ID的所有实例?我试图删除可能在数组中出现多次的特定产品ID。 –

+0

@NeilLunn我尝试使用拉,它擦除该产品ID的每个实例。我记得你在一周前帮助了我,并且遇到了与承诺有关的类似问题。这是我的代码上面发生了什么? –

回答

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,因此只会有一个文档与查询匹配。

+0

@ sam-d这对你有帮助吗? – benjiman

+0

但不会从数组中删除该产品ID的所有实例?我试图删除可能在数组 –

+0

中多次出现的特定产品ID,或者我应该执行拉动然后设置?这可能可以解决问题 –