我在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();
但不要这样做。
答案 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);
}
});