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:更新不保存的主要内容,如果未能解决你的问题,请参考以下文章