如果字段是日期类型,我怎么能在mongodb中知道?

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"结果?

sap*_*pht 7

您可以使用 $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 一样。也许您可以检查该对象并查找构造函数名称。


lar*_*ron 5

我终于找到了解决方案.

正如@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)

我仍然不承认为什么.