mongodb日期插入就像使用猫鼬一样

时间:2015-10-21 23:13:34

标签: node.js mongodb express

我在mongodb中插入批量记录。我使用本机DB驱动程序来执行此操作,因为性能要高得多。在我的应用程序的其他点,我使用猫鼬。我遇到的问题是,mongoose将日期转换为不同的格式,而mongodb native只是将它插入自1970年以来的秒数。因此稍后基于该日期的mongoose查询不起作用。

这是我的猫鼬模式:

var MySchema = new Schema({
  name              : { type: String, required: true },
  updatedAt         : Date
});

我的mongo db mass insert:

var newRec = { 
    name        : entry.Name, 
    updatedAt   : Date.now
};
newRecords.push(newRec);

MySchema.collection.insert(newRecords, function(err, newRecs) {
            res.json(newRecs.ops);
          });

这在DB中产生:

{
    "_id": {
        "$oid": "562818ecf24d540f0053a38d"
    },
    "name": "Cool Record",
    "updatedAt": 12312423512
}

如果它是通过Mongoose运行的,它会产生:

{
    "_id": {
        "$oid": "561fd90285b5e73f5626f74e"
    },
    "name": "Cool Record",
    "updatedAt": {
        "$date": "2015-10-20T20:01:17.553Z"
    }
}

如果通过mongoose,这样的查询效果很好:

MySchemda.find({ updatedAt : { $gt: lastSynced }}).exec();

但不要这样做。

2 个答案:

答案 0 :(得分:1)

Date.now数字,表示自1970年以来的毫秒数。虽然它在概念上代表了一个日期,但它实际上并不是Date

var x = Date.now;
typeof x;
// "number"

您需要将架构切换为:

var MySchema = new Schema({
    name              : { type: String, required: true },
    updatedAt         : Number
});

或者,您可以使用:

var newRec = {
    name: entry.Name,
    updatedAt: new Date()
}

并保持您的架构不变。

答案 1 :(得分:-1)

您可以像这样使用它: 定义日期类型和默认值,然后创建一个可以定义为模式使用year : new Date的变量,这将有助于设置日期。

var songSchema = new mongoose.Schema({
name : String,
year : {type : Date, default : Date.now}, 
singer : String,
});
var song  = mongoose.model("song", songSchema);
var xyz= new song({
name : "abcd",
year :new Date,  // to set the date first set new Date
singer : "aabbccdd",
});

您可以使用setDate,setMonth,setYear方法来解决问题。在对象年下定义了更多方法。您可以在mongoose的文档中进一步了解。

xyz.save(function(err, songs){
if(err) 
winston.log("Something is wrong"+ "   "+ err);
else {
songs.year.setDate(03); 
songs.year.setMonth(03);
songs.year.setYear(2015);
winston.log(songs);
}
});