【发布时间】: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