2017-04-10 5 views
0

ExpressJs + Mongodb에서 전자 상거래 웹 사이트를 구축하고 있는데 걱정거리가 있습니다. 언제 카트를 만료 (카트를 제거하고 제품을 재고로 반납해야합니까) 할 수 있습니까? 사용자가 카트를 방문 할 때마다? 또는 크론 작업이 필요합니까?몽고 : 언제 장바구니를 만료해야합니까?

이 나는이 기사를 따랐습니다 : 당신은 쇼핑 카트를 저장하는 분산 세션의 어떤 종류를 사용해야합니다

'use strict'; 

const mongoose = require('mongoose'); 
const Schema = mongoose.Schema; 
const CartItem = new Schema({ 
    product: { type: Schema.Types.ObjectId, ref: 'Product' }, 
    quantity: Number 
}); 

const Cart = new Schema({ 
    userSessionId: String, 
    status: { 
     type: String, 
     enum: [ 'active', 'completed', 'expiring', 'expired' ], 
     default: 'active' 
    }, 
    items: [ CartItem ], 
    modifiedOn: { type: Date } 
}); 

Cart.static({ 
    summary: function(params, cb) { 
     this.aggregate([ 
      { 
       $match: { userSessionId: params.userSessionId } 
      }, 
      { 
       $unwind: { 
        path: '$items' 
       } 
      }, 
      { 
       $lookup: { 
        from: 'products', 
        localField: 'items.product', 
        foreignField: '_id', 
        as: 'product' 
       } 
      }, 
      { 
       $unwind: { 
        path: '$product', 
        preserveNullAndEmptyArrays: true 
       } 
      }, 
      { 
       $group: { 
        _id: { userSessionId: '$userSessionId' }, 
        count: { $sum: '$items.quantity' }, 
        total: { $sum: { $multiply: [ '$product.price', '$items.quantity' ] } } 
       } 
      } 
     ], (err, results) => cb(err, results[0])); 
    }, 
    addProduct: function(params, cb, test) { 
     var d = new Date(); 

     if (test) { 
      d.setMinutes(d.getMinutes() - 10); 
     } 

     this.findOneAndUpdate(
      { userSessionId: params.userSessionId }, 
      { $set: { modifiedOn: d } }, 
      { upsert: true, new: true }, (err, cart) => { 
       if (err) { 
        return cb(err); 
       } 

       const index = cart.items.findIndex((item) => { 
        return item.product.equals(params.productId); 
       }); 

       if (index === -1) { 
        cart.items.push({ 
         product: params.productId, 
         quantity: params.quantity 
        }); 
       } else { 
        cart.items[index].quantity += parseFloat(params.quantity); 
       } 
       cart.save(cb); 
      }); 
    }, 
    updateQuantity: function(params, cb) { 
     this.findOneAndUpdate(
      { userSessionId: params.userSessionId }, 
      {}, 
      { upsert: true, new: true }, (err, cart) => { 
       if (err) { 
        return cb(err); 
       } 

       const index = cart.items.findIndex((item) => { 
        return item.product.equals(params.productId); 
       }); 

       if (index === -1) { 
        return cb(new Error('Can not find product in cart')); 
       } 
       cart.items[index].quantity = params.quantity; 

       cart.save(cb); 
      }); 
    }, 
    findItem: function(params, cb) { 
     this.findOne({ userSessionId: params.userSessionId }).exec((err, cart) => { 
      if (err) { 
       return cb(err); 
      } 

      const index = cart.items.findIndex((item) => { 
       return item.product.equals(params.productId); 
      }); 

      if (index === -1) { 
       return cb(new Error('Can not find product in cart')); 
      } 

      cb(null, cart.items[index]); 
     }); 
    }, 
    removeProduct: function(params, cb) { 
     this.update(
      { userSessionId: params.userSessionId }, 
      { 
       $pull: { items: { product: params.productId } }, 
       $set: { modifiedOn: new Date() } 
      }, 
      cb 
     ); 
    }, 
    getExpiredCarts: function(params, cb) { 
     var now = new Date(); 

     if (typeof params.timeout !== 'number') { 
      return cb(new Error('timeout should be a number!')); 
     } 

     now.setMinutes(now.getMinutes() - params.timeout); 

     this.find(
      { modifiedOn: { $lte: now }, status: 'active' } 
     ).exec(cb); 
    } 
}); 

mongoose.model('Cart', Cart); 

답변

0

: https://www.infoq.com/articles/data-model-mongodb

가 여기 내 카트 모델의 구현입니다!

난 당신 같은 뭔가를 찾고 생각 : https://www.youtube.com/watch?v=g32awc4HrLA

그것은 당신이 분산 캐시를 가지고 있으며 응용 프로그램의 여러 인스턴스와 함께 작동합니다 다음 expressjs-sessionmongodb를 사용합니다.

+0

안녕하세요 @marco, 저는 expressjs-session을 실제로 사용하고 있습니다. 내 걱정거리는'''언제 카트를 만료 (카트를 제거하고 제품을 재고로 반환)해야합니까? 사용자가 카트를 방문 할 때마다? 또는 크론 작업이 필요합니까? ''' –

+0

만약'mongodb'를 사용한다면 https://docs.mongodb.com/manual/tutorial/expire-data/를 설정하여 일정 기간 후에 문서를 삭제할 수 있습니다. 그렇게한다면'cron job '을 사용할 필요가 없습니다. X 일 후에 만료 될 수 있습니다. –

+1

감사합니다. 나는 당신에게 제안을 시도 할 것입니다. –