返回MongoDB中字段的实际类型

时间:2010-07-08 22:41:20

标签: mongodb mongodb-query aggregation-framework

在MongoDB中,使用$type,可以根据字段是否与BSON数据类型匹配来过滤搜索(请参阅DOCS)。

例如。

db.posts.find({date2: {$type: 9}}, {date2: 1})

返回:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "date2" : "Fri Jul 09 2010 08:25:26 GMT" 
}

我需要一个查询,告诉我该字段的实际类型是什么,对于集合中的每个字段。 MongoDB可以实现吗?

4 个答案:

答案 0 :(得分:15)

在mongo shell中键入以下查询

  typeof db.employee.findOne().first_name

语法

 typeof db.collection_name.findOne().field_name

答案 1 :(得分:15)

从MongoDB 3.4开始,您可以使用$type聚合运算符返回字段的类型。

db.posts.aggregate( 
    [ 
        { "$project": { "fieldType": {  "$type": "$date2"  } } } 
    ]
)

产生:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "fieldType" : "string" 
}

答案 2 :(得分:7)

好的,这里有一些可能有帮助的相关问题:

使用map-reduce的

Get all field names集合。

此处列出了所有可能字段的a recursive version

希望这可以帮助你入门。但是,我怀疑你会遇到这个请求的一些问题。这里有两个问题:

  1. 我找不到JSON的“gettype”函数。您可以按$type进行查询,但看起来您实际上无法在字段上运行gettype函数并将其映射回BSON类型。
  2. 字段可以包含多种类型的数据,因此您需要一个计划来处理此问题。即使不明显,Mongo也可以存储一些数字作为整数,而其他数据则在你不知道的情况下漂浮。事实上,使用PHP驱动程序,这很有可能。
  3. 因此,如果您认为可以解决问题#1,那么您应该能够使用“获取所有字段名称”的略微变化来解决问题#2。

    它可能看起来像这样:

    "map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } }
    "reduce" : function(key, stuff) { return (key, add_to_set(stuff) ); }
    

    所以基本上你会在map函数中发出keytype of key value(作为数组)。然后从reduce函数中为每种类型添加唯一条目。

    在运行结束时,你会得到这样的数据

    {"_id":[255], "name" : [1,5,8], ... }

    当然,这是很多工作,根据您的实际问题,您可能只想确保(从您的代码中)您总是放入正确类型的数据。在数据进入数据库之后查找数据类型肯定是一种痛苦。

答案 3 :(得分:0)

注意到a=5;a.constructor.toString()打印function Number() { [native code] },可以做类似的事情:

db.collection.mapReduce(function() { emit(this._id.constructor.toString().replace(/^function (\S+).+$/, "$1"), 1); }, function(k, v) { return Array.sum(v); }, { out: { inline: 1 } });