猫鼬:无法更新日期类型的文档

时间:2015-08-31 13:28:40

标签: node.js mongodb mongoose mongodb-query

我想将日期类型的文档更新为当前日期。 我的架构是

var appEventActivity = mongoose.Schema({
                    app_key : String,
                    e_id:String,//event id from appEvent
                    u_imei:String,//user imei from appUsers
                    startAt:{type: Date, default : Date.now()},
                    endAt:{type: Date, default : Date.now()}
                });

我的更新部分代码是

AppEventActivity.findOneAndUpdate({_id:req.update_event_id},{$currentDate : {endAt:true}}, function(err,data){
            if(err)console.log(err);
            res.send(data);

        });
我见过 add created_at and updated_at fields to mongoose schemasHow do I update a property with the current date in a Mongoose schema on every save?但未获得成功。

1 个答案:

答案 0 :(得分:0)

我在这里看到的唯一问题是遗漏{ "new": true }以便返回修改后的文档:

AppEventActivity.findOneAndUpdate(
   { "_id": req.update_event_id },
   { "$currentDate" : { "endAt": true} },
   { "new": true },
   function(err,data){
      if(err)console.log(err);
      res.send(data);
  });

如果没有{ "new": true },则返回的文档是“更新之前”的“未修改”版本。设置它会显示刚刚执行的更新。

这是与MongoDB驱动程序默认行为一致的传统模式。

MongoDB的$currentDate运算符否则按预期工作。这是一个完整的清单:

var async = require('async'),
    mongoose = require('mongoose')
    Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');

var testSchema = new Schema({
  "name": String,
  "date": { type: Date, default: Date.now }
});

var Test = mongoose.model( 'Test', testSchema, 'test' );

async.series(
  [
    function(callback) {
      Test.remove({},callback);
    },
    function(callback) {
      Test.findOneAndUpdate(
        { "name": "me" },
        { "$currentDate": { "date": true } },
        { "new": true, "upsert": true  },
        function(err,doc) {
          console.log(doc);
          callback(err);
        }
      );
    }
  ],
  function(err) {
    if (err) throw err;
    mongoose.disconnect();
  }
);

输出:

{ _id: 55e45ba528f7d03a06a2dd6e,
  name: 'me',
  __v: 0,
  date: Mon Aug 31 2015 23:50:29 GMT+1000 (AEST) }

因此,在服务器操作上设置了一个新日期,而不是在客户端上,这就是你所追求的。