Я пытаюсь определить функцию statics
с именем convertFromCartItems
, которая принимает массив моделей типа CartItem
, создает массив моделей типа OrderItem
, а затем вставляет их в одну операцию, используяMongoDB insertMany()
.Моя текущая функция для создания Order
из Cart
(родительские модели, на которые указывают соответственно OrderItem
и CartItem
) выглядит следующим образом:
schema.statics.convertFromCart = function (cart, shipping, then, unless) {
let order = new this()
order._cart = cart
order.firstName = shipping.firstName
order.lastName = shipping.lastName
order.email = shipping.email
order.address = shipping.address
order.addressCity = shipping.addressCity
order.addressPostalCode = shipping.addressPostalCode
order.addressRegionCode = shipping.addressRegionCode
order.addressCountryCode = shipping.addressCountryCode
order.save((err, thing) => {
if (!err && thing) {
then(thing)
} else {
unless(err)
}
})
}
Эта функция вызывает .save()
сам по себе, чтобы вызвать его, у меня есть строка, подобная этой:
models.Order.convertFromCart(cart, shipping, (order) => {
// Do something with the newly created 'Order'
})
Однако в Mongoose (и действительно MongoDB) insertMany()
определено на модели, а не на экземпляре, поэтому я хочу сделатьвыглядит примерно так:
schema.statics.convertFromCartItems = function (order, items, then unless) {
let orderItems = []
items.forEach((item) => {
let orderItem = this()
orderItem._item = item
orderItem._order = order
orderItem.quantity = item.quantity
orderItem.subscribed = item.subscribed
orderItem.name = item._item._product.name
orderItem.variation = item._item.variation
orderItem.price = item._item.price
orderItem.image = item._item._product.image
orderItem.created = item.created
orderItem.updated = item.update
orderItems.push(orderItem)
})
// code I want to use
OrderItemSchema.insertMany(orderItems, funciton (err, things) {
if (!err && things) {
then(things)
} else {
unless(err)
}
})
}
Однако пока внутри этой функции statics.convertFromCartItems
, OrderItemSchema
еще не существует.Mongoose использует некоторую хитрость this
, чтобы позволить мне создать экземпляр модели, вызывая this()
, но this.insertMany()
или this().insertMany()
не работают (так как insertMany()
на модели, а не на экземпляре).Текущий обходной путь - вернуть массив и затем вызвать models.OrderItem.insertMany()
для элементов вне этой функции.Любые идеи о том, как я могу заставить эту функцию вставлять себя?
Если это поможет понять, что мне нужно, вот краткий обзор этих двух моделей.У меня есть модель, которая представляет элемент в корзине (CartItem
), и я пытаюсь взять их массив и создать массив строк в завершенном порядке (OrderItem
) (это похоже на Система двойного учета , позволяющая завершенному заказу иметь моментальный снимок данных в момент получения заказа, в то время как CartItem
может указывать на текущее определение таких вещей, как название продукта и цена).