【发布时间】:2018-08-11 14:41:04
【问题描述】:
我很确定这个问题被问了很多项,但是我找不到我的特定问题的答案,这看起来很正常,但我似乎无法让它发挥作用。我有一个嵌入了购物车模式数组的用户模型。我正在尝试将一个对象添加到数组中,如果它存在只更新数量和价格,如果它不添加到数组中。我的代码发生的情况是,当数组为空时它会添加一个新项目,它会更新项目的数量和价格,但它不想添加新项目。我读了一点,据我所知,我不能在一个请求中使用两种不同的数据库方法。我将不胜感激,这是我第一次真正使用猫鼬。
const CartItem = require('../models/cartModel');
const User = require('../models/userModel');
exports.addToCart = (req, res) => {
const cartItem = new CartItem.model(req.body);
const user = new User.model();
User.model
.findById(req.params.id)
.exec((err, docs) => {
if (err) res.sendStatus(404);
let cart = docs.cart;
if (cart.length == 0) {
docs.cart.push(cartItem);
}
let cart = docs.cart;
let isInCart = cart.filter((item) => {
console.log(item._id, req.body._id);
if (item._id == req.body._id) {
item.quantity += req.body.quantity;
item.price += req.body.price;
return true;
}
});
if (isInCart) {
console.log(cart.length)
} else {
cart.push(cartItem);
console.log(false);
}
docs.save(function (err, docs) {
if (err) return (err);
res.json(docs);
});
});
};
我实际上设法让它像这样工作
exports.addToCart = (req, res) => {
const cartItem = new Cart.model(req.body);
const user = new User.model();
User.model
.findById(req.params.id)
.exec((err, docs) => {
if (err) res.sendStatus(404);
let cart = docs.cart;
let isInCart = cart.some((item) => {
console.log(item._id, req.body._id);
if (item._id == req.body._id) {
item.quantity += req.body.quantity;
item.price += req.body.price;
return true;
}
});
if (!isInCart) {
console.log(cart.length)
cart.push(cartItem);
}
if (cart.length == 0) {
cart.push(cartItem);
}
docs.save(function (err, docs) {
if (err) return (err);
res.json(docs);
});
});
};
不知道这是否是正确的做法,但我既可以将新产品添加到我的数组中,也可以更新现有产品的值
【问题讨论】:
-
您已经注意到这是不可能的。你必须做两个查询。请查看链接的副本。
-
我认为这是个问题。但是,为什么可以在数组为空时添加一个新元素,然后在已将其推入数组时更新一个值?这不是两种不同的方法吗?
-
所以无论数组是否为空,问题都是一样的。您只能运行一个查询,即更新数组或在任何时候向数组添加元素。本质上,数组没有 upsert 类型的功能可以在一个更新查询中处理这个问题。
标签: arrays mongodb mongoose push