lar*_*ron 6 date mongodb node.js
我正在研究NodeJS + Mongodb应用程序.
我刚刚使用控制台客户端将一条记录插入mongodb:
db.user.save({myId:11111, myDate: ISODate("2012-04-30T00:00:00.000Z")})
Run Code Online (Sandbox Code Playgroud)
问题是,当我在node.js时,我需要知道"myDate"字段是否真的是Date类型,以便执行数据范围查询等.
我尝试了以下内容.
1.在mongo客户端控制台上:
typeof db.user.myDate --> It returns "Object"
db.user.myDate instanceof Date --> It returns "false"
Run Code Online (Sandbox Code Playgroud)
2.在我的Nodejs代码上,
我正在尝试调用此getTypeMembers
函数的类型.(obj来自db查询)
exports.getTypeMembers = function(obj) {
obj = JSON.parse(JSON.stringify(obj)
for(var _k in obj){
if(Object.prototype.toString.call(obj[_k]) === '[object Array]' ) {
obj[_k] = "Array";
}
else if(typeof(obj[_k])=="object"){
obj[_k] = this.getTypeMembers(obj[_k]);
}else{
obj[_k] = typeof (obj[_k]);
}
}
return obj;
Run Code Online (Sandbox Code Playgroud)
};
我在这种方法中得到的是:"String"
,当我需要时"Date"
有没有其他方法可以获得某种"Date"
结果?
您可以使用 $type 运算符来查询特定类型的字段:
db.col.query({a: {$type: 9}})
Run Code Online (Sandbox Code Playgroud)
9 是日期类型的数字,请参阅 http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24type
至于确定node.js内部的类型,这取决于您的驱动程序。我没有使用过,但它可能是一个特定的原型,就像 ObjectId 一样。也许您可以检查该对象并查找构造函数名称。
我终于找到了解决方案.
正如@christkv所说,一旦你调用JSON stringify,所有原始类型肯定会丢失.所以,用这种方式思考,我的方法getTypeMembers
对我来说非常合适.
请注意,obj参数来自DB,并且直接省略"_id"(mongodb标识符)以避免执行递归函数时出现问题:
exports.getTypeMembers = function(obj) {
for(var _k in obj){
if (_k =="_id") continue;
if (Object.prototype.toString.call(obj[_k]) === "[object Number]"){
obj[_k] = "Number";
}else if (Object.prototype.toString.call(obj[_k]) === "[object String]"){
obj[_k] = "String";
}else if (Object.prototype.toString.call(obj[_k]) === "[object Date]"){
obj[_k] = "Date";
} else if(Object.prototype.toString.call(obj[_k]) === '[object Array]' ) {
obj[_k] = "Array";
} else if(typeof(obj[_k])=="object"){
obj[_k] = this.getTypeMembers(obj[_k]);
} else{
obj[_k] = (typeof obj[_k])[0].toUpperCase() + (typeof obj[_k]).slice(1);
}
}
return obj;
};
Run Code Online (Sandbox Code Playgroud)
在Mongo控制台部分,我只能得到以下类型:
db.user.find({},{myDate:1}).forEach(function(f) { print (f.myDate instanceof Date) } );
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,
typeof db.user.myDate --> It returns "Object"
db.user.myDate instanceof Date --> It returns "false"
Run Code Online (Sandbox Code Playgroud)
我仍然不承认为什么.
归档时间: |
|
查看次数: |
8929 次 |
最近记录: |