2017-04-10 16 views
0

私はExpressJs + Mongodbによって電子商取引のウェブサイトを構築していますが、私はこの懸念に悩まされています: カートを期限切れにする必要があるのはいつですか(技術的にカートを取り出して商品を在庫に戻す)?ユーザーがカートを訪れるたびに?または私はcronの仕事が必要か?Mongodb:いつショッピングカートを期限切れにする必要がありますか?

私はこの記事に従ってきました:https://www.infoq.com/articles/data-model-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.youtube.com/watch?v=g32awc4HrLA

それはあなたが分散キャッシュを持っているし、それはあなたのアプリケーションの複数のインスタンスで動作します、その後expressjs-sessionmongodbを使用しています。

+0

こんにちは@marco、私はexpressjs-sessionを実際に使っています。私の懸念事項は「 ''いつカートを期限切れにして(カートを取り出して製品を在庫に戻す)技術的に必要なのでしょうか?ユーザーがカートを訪れるたびに?または私はcronの仕事が必要か? '' ' –

+0

もしあなたが' mongodb'を使っているなら、一定期間後に文書を削除する 'ttl' https://docs.mongodb.com/manual/tutorial/expire-data/を設定することができます。あなたがそうするなら、あなたは 'cronジョブ 'を使う必要はありません。 X日後に有効期限が切れます。 –

+1

ありがとう、私はあなたに提案を試みます –

関連する問題