【问题标题】:mongoose - change ttl for a single documentmongoose - 更改单个文档的 ttl
【发布时间】:2014-04-02 02:39:50
【问题描述】:

我有一件非常确定的事情要完成,我想确保在我自己编写整个事情之前,在 mongoose/mongoDB 中这是不可能的。 我检查了 mongoose-ttl 的 nodejs 和几个论坛,并没有找到我需要的东西。 在这里:

我有一个带有日期字段 createDate 的架构。现在我希望在该字段上放置一个 TTL,到目前为止一切都很好,我可以这样做(在 5000 秒内到期): createDate: {type: Date, 默认: Date.now, expires: 5000}

但我希望我的用户能够“投票”他们喜欢的文档,这样这些文档将获得更长的生存时间,而无需更改我收藏中的其他文档。 那么,一旦用户告诉我他喜欢使用 mongoose 或其他现有 npm 相关模块的文档,我可以以某种方式更改 SINGLE 文档的 TTL 吗?

谢谢你

【问题讨论】:

    标签: mongoose ttl


    【解决方案1】:

    您可以在 mongodb 中使用时钟时间到期功能。每次要延长文档的到期时间时,您都必须更新到期时间。

    http://docs.mongodb.org/manual/tutorial/expire-data/#expire-documents-at-a-certain-clock-time

    【讨论】:

      【解决方案2】:

      已经一年多了,但这可能对其他人有用,所以这是我的回答:

      我正在尝试完成同样的事情,以便在删除条目后允许 宽限期,以便用户可以在之后取消操作。

      Mike Bennett 所述,您可以使用TTL 索引making documents expire at a specific clock time

      你必须创建一个索引,将expireAfterSeconds 设置为零:

      db.yourCollection.createIndex({ "expireAt": 1 }, { expireAfterSeconds: 0 });
      

      这不会影响您集合中的任何文档,除非您像这样在特定文档上设置 expireAfterSeconds:

      db.log_events.insert( {
         "expireAt": new Date('July 22, 2013 14:00:00'),
         "logEvent": 2,
         "logMessage": "Success!"
      } )
      

      猫鼬示例

      型号

      var BeerSchema = new Schema({
        name: {
          type: String,
          unique: true,
          required: true
        },
        description: String,
        alcohol: Number,
        price: Number,
        createdAt: { type: Date, default: Date.now }
        expireAt: { type: Date, default: undefined } // you don't need to set this default, but I like it there for semantic clearness
      });
      
      BeerSchema.index({ "expireAt": 1 }, { expireAfterSeconds: 0 });
      

      宽限期删除

      使用moment 进行日期操作

      exports.deleteBeer = function(id) {
        var deferred = q.defer();
      
        Beer.update(id, { expireAt: moment().add(10, 'seconds') }, function(err, data) {
          if(err) {
            deferred.reject(err);
          } else {
            deferred.resolve(data);
          }
        });
        return deferred.promise;
      };
      

      恢复删除

      使用moment 进行日期操作

      exports.undeleteBeer = function(id) {
        var deferred = q.defer();
        // Set expireAt to undefined
        Beer.update(id, { $unset: { expireAt: 1 }}, function(err, data) {
          if(err) {
            deferred.reject(err);
          } else {
            deferred.resolve(data);
          }
        });
        return deferred.promise;
      };
      

      【讨论】:

        猜你喜欢
        • 2014-05-13
        • 2021-01-24
        • 1970-01-01
        • 2017-05-29
        • 2015-12-22
        • 2013-07-02
        • 2015-02-19
        • 2015-10-22
        相关资源
        最近更新 更多