MongoDB的类型转换。包括:string转double, string转int, string转Date
//string转为double类型
db.law.find({'state' : { $type : 2 }}).forEach( function (x) {
x.state = parseInt(x.state);
db.law.save(x);
});
//string转为int类型
db.law.find().forEach( function (x) {
x.ise= NumberInt(x.ise);
db.law.save(x);
});
//string转化为date类型
db.law.find().forEach( function (x) {
x.eift = new ISODate(x.eift);
db.law.save(x);
});
//string转decimal
db.law.find().forEach(function(x) {
x.num_string = NumberDecimal(Number(x.num_string));
db.law.save(x);
})
//将其转为string类型
db.law.find({ID:{$exists:true}}).forEach(function(x){
x.ID=new String(x.ID);
db.law.save(x);//保存
});
$type 有效的类型值,如下:
Type | Number | Alias | Notes |
---|---|---|---|
Double | 1 | “double” | 浮点型 |
String | 2 | “string” | UTF-8字符串都可表示为字符串类型的数据 |
Object | 3 | “object” | Object 对象,嵌套另外的文档 |
Array | 4 | “array” | 值的集合或者列表可以表示成数组 |
Binary data | 5 | “binData” | 二进制 |
Undefined | 6 | “undefined” | Deprecated. |
ObjectId | 7 | “objectId” | 对象id是文档的12字节的唯一 ID 系统默认会自动生成 |
Boolean | 8 | “bool” | 布尔类型有两个值TRUE和FALSE |
Date | 9 | “date” | 日期类型存储的是从标准纪元开始的毫秒数。不存储时区 |
Null | 10 | “null” | 用于表示空值或者不存在的字段 |
Regular Expression | 11 | “regex” | 采用js 的正则表达式语法 |
DBPointer | 12 | “dbPointer” | Deprecated. |
JavaScript | 13 | “javascript” | 可以存放Javasript 代码 |
Symbol | 14 | “symbol” | Deprecated. |
JavaScript (with scope) | 15 | “javascriptWithScope” | |
32-bit integer | 16 | “int” | 32位整数类型 |
Timestamp | 17 | “timestamp” | 时间戳数据类型 |
64-bit integer | 18 | “long” | 64位整数类型 |
Decimal128 | 19 | “decimal” | New in version 3.4. |
Min key | -1 | “minKey” | |
Max key | 127 | “maxKey” |
$type使用法语:
db.集合名.find({$type:类型值}); //这里的类型值能使用Number也能使用alias
查看“times”该字段的数据类型:
db.getCollection('content').find({"times":{$type:"long"}});
db.getCollection('content').find({"times":{$type:18}});
MongoDB存储时间类型数据时,都是先转换为UTC时间,然后存储到数据库中,当我们取出存储的时间时,就会出现时差的问题。比如我们用的北京时间,读取到的数值就会看到比当前时间少了8个小时,难道说我们在每次读取的时候都要单独处理一下时间吗,这就比较麻烦。其实,我们可以在存储的时候进行相应的处理,只需使用getTimezoneOffset()
和toISOString()
函数。
localDate(v) {
const d = new Date(v || Date.now());
d.setMinutes(d.getMinutes() - d.getTimezoneOffset());
return d.toISOString();
},
我们在存储时间的时候调用localDate()
这个函数就可以了,无论你处在哪个时区结果显示都和当地时间一样。