猫鼬数组对象中的递增数字
Incrementing number in an object of mongoose array
我正在尝试使用猫鼬增加 MongoDB 中的数字。但是我在查询阶段就开始失败了。当我 // @ts-ignore
它静静地流动,没有错误,但值没有更新。
它抛出的错误是: Type 'number' is not assignable to type 'undefined'
我的架构:
const CartSchema: Schema<Document<ICart>> = new Schema({
clientID: { type: String, required: true },
sourceID: { type: String, required: true },
items: {
id: { type: Types.ObjectId },
amount: { type: Number },
grindHow: { type: String, trim: true },
grind: Boolean,
package: { type: String, trim: true },
price: { type: Number },
productID: { type: String },
productName: { type: String },
totalProduct: { type: Number },
},
source: { type: String, required: true },
}, { collection: "carts", timestamps: true });
CartSchema.virtual('cartTotal').get(function() {
// @ts-ignore
const self: any = this;
if(self.items && self.items.length) {
return self.items.reduce((acc: BigNumber, current: any) => acc.plus(current.totalProduct), new BigNumber(0))
} else {
return 0
}
})
我尝试实现的方式是:
const item = await CartModel.findOneAndUpdate({ sourceID: clientID, 'items.id': itemID }, { $inc: { 'items.$.amount': 1 }}).lean({ virtuals: true })
我也试过 updateOne
。我想也许它更灵活。
items
不是数组,是对象。您应该使用 items.amount
和 而不是 使用 items.$.amount
访问它。像这样更改您的查询:
const item = await CartModel.findOneAndUpdate({ sourceID: clientID, 'items.id': itemID }, { $inc: { 'items.amount': 1 }}).lean({ virtuals: true })
问题出在两个地方。
我的架构问题 - 我将其描述为一个对象(感谢@Nenad Milosavlievic)
正确的架构是(或接近正确。欢迎提供有关架构的任何提示):
const CartSchema: Schema<Document<ICart>> = new Schema({
clientID: { type: String, required: true },
sourceID: { type: String, required: true },
items: { type: Array },
source: { type: String, required: true },
}, { collection: "carts", timestamps: true });
还有一个问题是我查询商品的方式。我应该将字符串 ID 转换为 ObjectId
。我错过了......
本来应该是这样的(加上我需要return更新值,所以我添加了一个选项{ new: true }
):
await CartModel.findOneAndUpdate({ sourceID: clientID, 'items.id': Types.ObjectId(itemID) }, { $inc: { 'items.$.amount': 1 }}, { new: true }).lean({ virtuals: true })
我正在尝试使用猫鼬增加 MongoDB 中的数字。但是我在查询阶段就开始失败了。当我 // @ts-ignore
它静静地流动,没有错误,但值没有更新。
它抛出的错误是: Type 'number' is not assignable to type 'undefined'
我的架构:
const CartSchema: Schema<Document<ICart>> = new Schema({
clientID: { type: String, required: true },
sourceID: { type: String, required: true },
items: {
id: { type: Types.ObjectId },
amount: { type: Number },
grindHow: { type: String, trim: true },
grind: Boolean,
package: { type: String, trim: true },
price: { type: Number },
productID: { type: String },
productName: { type: String },
totalProduct: { type: Number },
},
source: { type: String, required: true },
}, { collection: "carts", timestamps: true });
CartSchema.virtual('cartTotal').get(function() {
// @ts-ignore
const self: any = this;
if(self.items && self.items.length) {
return self.items.reduce((acc: BigNumber, current: any) => acc.plus(current.totalProduct), new BigNumber(0))
} else {
return 0
}
})
我尝试实现的方式是:
const item = await CartModel.findOneAndUpdate({ sourceID: clientID, 'items.id': itemID }, { $inc: { 'items.$.amount': 1 }}).lean({ virtuals: true })
我也试过 updateOne
。我想也许它更灵活。
items
不是数组,是对象。您应该使用 items.amount
和 而不是 使用 items.$.amount
访问它。像这样更改您的查询:
const item = await CartModel.findOneAndUpdate({ sourceID: clientID, 'items.id': itemID }, { $inc: { 'items.amount': 1 }}).lean({ virtuals: true })
问题出在两个地方。
我的架构问题 - 我将其描述为一个对象(感谢@Nenad Milosavlievic) 正确的架构是(或接近正确。欢迎提供有关架构的任何提示):
const CartSchema: Schema<Document<ICart>> = new Schema({
clientID: { type: String, required: true },
sourceID: { type: String, required: true },
items: { type: Array },
source: { type: String, required: true },
}, { collection: "carts", timestamps: true });
还有一个问题是我查询商品的方式。我应该将字符串 ID 转换为 ObjectId
。我错过了......
本来应该是这样的(加上我需要return更新值,所以我添加了一个选项{ new: true }
):
await CartModel.findOneAndUpdate({ sourceID: clientID, 'items.id': Types.ObjectId(itemID) }, { $inc: { 'items.$.amount': 1 }}, { new: true }).lean({ virtuals: true })