代码之家  ›  专栏  ›  技术社区  ›  Alexander Zeitler

MongoDB:仅当集合自时间点以来没有更新的文档时,才在集合中插入文档

  •  1
  • Alexander Zeitler  · 技术社区  · 6 年前

    我想用mongodb描述以下用例:

    我想从一本书中读到并记住那个特定的时间点。 下次写入该集合时,如果在此期间向该集合中添加了其他文档,我希望无法写入新文档。 使用 timestamp 文件上的属性将是正常的。

    这有可能吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   Mạnh Quyết Nguyễn    6 年前

    findAndModify

    oldTimestamp

    db.collection.findAndModify({
        query: {timestamp: {$gt: oldTimestamp}},
        new: true, // Return modified / inserted document
        upsert: true, // Update if match found, insert otherwise
        update: {
             $setOnInsert: {..your document...}
        }
    })
    

    collection.findAndModify(criteria[, sort[, update[, options]]], callback)
    

    example

    db.collection('test').findAndModify(
      {timestamp: {$gt: oldTimestamp}}, // query, timestamp is a property of your document, often set as the created time
      [['timestamp','desc']],  // sort order
      {$setOnInsert: {..your document..}}, // replacement, replaces only the field "hi"
      {
          new: true,
          upsert: true
      }, // options
      function(err, object) {
          if (err){
              console.warn(err.message);  // returns error if no matching object found
          }else{
              console.dir(object);
          }
      });
    });
    
        2
  •  0
  •   Sushim Mukul Dutta    6 年前

    timestamp Mongoose Pre Save path validation hook

    YourSchema.path('timestamp').validate(function(value, done) {
      this.model(YourSchemaModelName).count({ timestamp: {$gt : value} }, function(err, count) {
        if (err) {
            return done(err);
        }
        // if count exists and not zero hence document is found with greater timestamp value
        done(!count);
    });
    }, 'Greater timestamp already exists');
    
        3
  •  0
  •   Nic Cottrell    6 年前

    timestamp

    db.collection.find({}, {timestamp: 1, _id:0}).sort({timestamp:-1}).limit(1)

    covered query