如何在MongoDB中知道字段是datetypes?

我正在研究NodeJS + Mongodb应用程序。

我刚刚使用控制台客户端将一条logging插入到mongodb中:

db.user.save({myId:11111, myDate: ISODate("2012-04-30T00:00:00.000Z")}) 

事情是,当我在node.js中时,我需要知道“myDate”字段是否真的是datetypes,以便执行数据范围查询等。

我尝试了以下。

1.在mongo客户端控制台上:

 typeof db.user.myDate --> It returns "Object" db.user.myDate instanceof Date --> It returns "false" 

2.在我的Nodejs代码上,

我想获得调用这个getTypeMembers函数的types。 (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; 

};

我得到这个方法是: "String" ,当我需要"Date"

有没有其他的方式来获得某种"Date"结果?

我终于find我的解决scheme。

正如@christkv所说,一旦你调用JSON stringify,所有原始types肯定会丢失。 所以,用这种方式思考,我的方法getTypeMembers对我来说是完美的。

请注意,obj参数来自DB,并且为了避免执行recursion函数时出现问题,还直接省略“_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; }; 

在Mongo控制台部分,我只能得到这样的types:

 db.user.find({},{myDate:1}).forEach(function(f) { print (f.myDate instanceof Date) } ); 

但是如果我这样做,

 typeof db.user.myDate --> It returns "Object" db.user.myDate instanceof Date --> It returns "false" 

我仍然不知道为什么。

我有点困惑的使用

 db.user.myDate 

在你的例子。 你是否正在调用Node-mongodb-native所提供的Db对象? 如果是这样,你应该得到未定义,因为你实际上不是在查询数据库,而是检查Db javascript对象的属性(几乎所有的确定性不存在的属性)。

你可以发布你从node.js进程运行的代码吗? 我testing了你的代码,使用相同的shell插入,一旦我从node.js中的数据库检索到文档,

 doc.myDate instanceof Date 

回复真实。

我也不熟悉你的应用程序,但是如果你不知道数据的types,那么查询集合似乎是不明智的。 为什么不确定其他应用程序使用myDate字段的值的types?

编辑:

 var coll = new mongo.Collection(client, 'user'); coll.find({}).toArray(function(err, docs) { docs.forEach(function (doc) { console.log(doc); console.log(doc.myDate instanceof Date); }); }); 

在同一个shell插入到你的nodejs中运行时,为我logging“true”。 如果你运行它会发生什么?

您可以使用$ type运算符来查询特定types的字段:

 db.col.query({a: {$type: 9}}) 

9是datetypes的数字,请参阅http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24type

至于确定node.js内的types,这取决于你的驱动程序。 我没有使用,但它可能是一个特定的原型,如ObjectId是如何。 也许你可以检查对象并查找构造函数名称。

从你最近的编辑判断,我相信我看到了这个问题。 您正在将文档parsing为JSON。 与BSON不同,JSON不支持字面创build和存储BSON对象。 ISODate对象是一个BSON数据types。

所以当你转换成JSON时,你实际上会失去这个对象。

你可以解决这两个方面:

  • 在检查字段types之前,不要转换为JSON
  • 每个对象都有属性。 date没有什么不同,它应该有一个$date属性(我相信),你可以检查是否isset看看是否typesdate