25

在 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

5 回答 5

36

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

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

产生:

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "fieldType" : "string" 
}
于 2016-06-26T14:10:32.593 回答
28

在 mongo shell 中输入以下查询

  typeof db.employee.findOne().first_name

句法

 typeof db.collection_name.findOne().field_name
于 2014-06-23T14:52:50.527 回答
9

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

使用 map-reduce获取集合中的所有字段名称

这是一个列出所有可能字段的递归版本。

希望这可以让你开始。但是,我怀疑您将在此请求中遇到一些问题。这里有两个问题:

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

因此,如果您假设您可以解决问题 #1,那么您应该能够使用"Get all field Names"的细微变化来解决问题 #2 。

它可能看起来像这样:

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

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

在运行结束时,您将拥有这样的数据

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

当然,这都是很多工作,根据您的实际问题,您可能只想确保(从您的代码)您始终输入正确类型的数据。在数据进入数据库后查找数据类型绝对是一件痛苦的事情。

于 2010-07-09T04:39:38.680 回答
1

利用 styvane 查询,我添加了一个 $group 列表,以便在我们有不同的数据类型时更容易阅读。

db.posts.aggregate( 
[ 
    { "$project": { _id:0, "fieldType": {  "$type": "$date2"  } } },
    {"$group": { _id: {"fieldType": "$fieldType"},count: {$sum: 1}}}
])

并得到这样的结果:

{ "_id" : { "fieldType" : "missing" }, "count" : 50 }
{ "_id" : { "fieldType" : "date" }, "count" : 70 }
{ "_id" : { "fieldType" : "string" }, "count" : 10 }
于 2021-09-01T15:24:40.137 回答
0

注意到a=5;a.constructor.toString()prints 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 } 
});
于 2015-05-28T23:07:01.320 回答