2010-07-08 87 views
8

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

例如,

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

返回:

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

我需要一个查询,会告诉我什么该领域的实际类型,为集合中的各个领域。这可能与MongoDB?

回答

6

OK,这里有一些相关的问题,可以帮助:

Get all field names集合中使用的map-reduce。

这是a recursive version列出所有可能的字段。

希望可以让你开始。不过,我怀疑你会遇到这个请求的一些问题。这里有两个问题:

  1. 我找不到JSON的“gettype”函数。您可以通过$type进行查询,但它看起来并不像您实际上可以在字段上运行gettype函数,并将其映射回BSON类型。
  2. 一个字段可以包含多种类型的数据,所以您需要一个计划来处理这个问题。即使它不是很明显,Mongo可以存储一些数字作为整数,而其他的浮点数不会让你真正知道。事实上,使用PHP驱动程序,这是很有可能的。

所以,如果你认为你能解决问题#1,那么你应该能够使用上略有变化“获取所有字段名”解决问题#2。

它可能会是这个样子:

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

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

在运行结束时,你会有这样的

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

当然数据,这都是很多的工作,这取决于你的实际问题,你可能只是想确保(从你的代码),你总是把正确的数据类型。数据在数据库中后查找数据类型绝对是一种痛苦。

6

型蒙戈下面的查询壳

typeof db.employee.findOne().first_name 

语法

typeof db.collection_name.findOne().field_name 
+1

这将给JS类型,其可从所述BSON类型而不同。例如,如果您键入db.employee.findOne()._ id,则会得到“string”,但BSON类型为“Object id”。 – 2014-10-16 02:37:13

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 } });

6

起价MongoDB 3.4,你c使用$type聚合运算符来返回字段的类型。

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

其产生:

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