如何使用mongoose仅在过期时删除子文档?

时间:2016-03-11 05:27:53

标签: node.js mongodb mongoose

当集合2中的文档过期时,我从集合1中删除子文档时遇到问题。

我有下面的购物车架构。

var cartSchema = new schema({
    userName    : {type: String, default: null},
    total       : {type: Number, default: 0},
    qty         : {type: Number, default: 0},
    productId   : {type: String, default: null},
    createdAt   : {type: Date, default: Date.now, expires: 7200} // expired in 2 hours
});

这里我有一个架构,用于保存与carted

相关的对象cartSchema
var merchantSchema = new schema({
    seller          : String,
    address         : String,
    email           : String,
    products        : [
       {
          title         : String,
          ingredients   : String,
          qty           : Number,
          carted        : [
              {
                  qty       : Number, 
                  cartId    : String, 
                  createdAt : {type: Date, default: Date.now}
              }
       }
    ],

});

由于expireAt查询会自动运行,因此我不知道如何在购物车过期和删除时自动删除购物对象。

cartSchemaid 123的购物车已过期并已删除时,带有id 123的购物车对象中的购物车也将被删除。

如果我在expires中添加merchantSchema createdAt : {type: Date, default: Date.now, expires: 7200}属性,则会删除整个文档。

1 个答案:

答案 0 :(得分:1)

您无法使用TTL index删除子文档。

可以通过population更改数据架构来完成一个解决方法,如下所示

var merchantSchema = new schema({
    seller          : String,
    address         : String,
    email           : String,
    products        : [productSchema],
});

var Merchant = mongoose.model('Merchant', merchantSchema);

var productSchema = new Schema({
    title         : String,
    ingredients   : String,
    qty           : Number
});

var Product = mongoose.model('Product', productSchema);

var cartSchema = new schema({
    userName    : {type: String, default: null},
    total       : {type: Number, default: 0},
    qty         : {type: Number, default: 0},
    productId   : {type: Schema.Types.ObjectId, ref: 'Product'},
    createdAt   : {type: Date, default: Date.now, expires: 7200} // expired in 2 hours
});

然后createdAt到期,然后cart文档将被删除,并且没有与product文档相关的购物车信息。