【发布时间】:2012-09-19 04:14:41
【问题描述】:
我正在开发一个 NodeJS+Mongodb 应用程序。
我刚刚使用控制台客户端在 mongodb 中插入了一条记录:
db.user.save({myId:11111, myDate: ISODate("2012-04-30T00:00:00.000Z")})
问题是,当我在 node.js 中时,我需要知道“myDate”字段是否真的是 Date 类型,以便执行数据范围查询等。
我尝试了以下方法。
1.在 mongo 客户端控制台上:
typeof db.user.myDate --> It returns "Object"
db.user.myDate instanceof Date --> It returns "false"
2。在我的 Nodejs 代码上,
我正在尝试获取调用此getTypeMembers 函数的类型。 (来自 db 查询的 obj)
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;
};
我在这个方法中得到的是:"String",当我需要"Date"时
还有其他方法可以获得某种"Date" 结果吗?
【问题讨论】:
-
您是否将带有
myDate的文档作为其他类型添加到其他地方?我猜我对你在这里想要完成的事情感到困惑。 -
没有。我总是使用相同的结构。我理解你的问题,这都是因为我的 webapp 需要从多个集合中获取数据,并且集合是由其他应用程序动态创建的,然后......我的 webapp 永远不知道每个集合背后的架构。我希望它有助于澄清我的想法。
-
如果您改为运行
db.user.myDate instanceof ISODate会怎样?我认为 node.js 直接在它的驱动程序中翻译ISODate。 -
您使用 JSON 解析器,日期将没有对象类型,它只是一个对象......因为 JSON 无法以真实形式容纳对象。在日期对象中应该有一个名为 $date 的子字段,检查一下。
-
当您调用 JSON stringify 时,日期对象使用 JSON.stringify(a) 更改为字符串 var a = {a:new Date()} 变为 '{"a":"2012-09 -28T11:05:56.163Z"}'。您必须检查实际的 bson 类型而不是 json 字符串化/解析的对象,这会将其减少为 JSON 支持的基本 javascript 类型(并且 Date 不是其中之一)