一、问题
使用Pymongo操作MongoDB:
最后一位随便输一个数,就匹配这一条。
问题描述:今天计划将tweet_id设置为集合的唯一索引,出现一条数据报错。报错对应的tweet_id为“255837612277911555”,在pymongo查找这条数据发现出现的结果和查询内容最后一位不一致。于是修改最后一位发现,改为其他数字仍然匹配该数据。
二、解决
----------------------------------2018.12.03更新------------------------------------------------------------
根据文档(1)点击跳转 (2)英文文档地址的说明,初步判断是因为MongoDB长整型和整型数据检索的区别:
即需要使用find({'tweet_id':NumberLong("255837612277911552")})
类似的,若果使用update命令进行更新某个字段为整型值为1,若使用db.getCollection('test').update({}, {'$set':{'test_field':1}}),会发现被更新的字段为float型。于是,我们需要使用“NumberInt(1)”替换上述test_field的属性“1”
三、扩展
附:统一化某个字段数据类型可参见:点击这里
示例:
db.getCollection('total_user_20181119').find({'id':{$type:16}}).forEach(function(x){
x.id = NumberLong(x.id);
db.getCollection('total_user_20181119').save(x)})
若果数据量过大,可自行遍历(以下代码为python程序):
total_data = data_col_from.find({'user.id': {'$type': 16}}, no_cursor_timeout=True)
for data in total_data:
data_user_id = long(data['user']['id'])
tweet_id = data['id']
print "user.id:", data_user_id, "\tid:", tweet_id
data['user']['id'] = data_user_id
data_col_from.save(data)
MongoDB字段类型编号:
1 —— Double 浮点型
2 ——String UTF-8字符串都可表示为字符串类型的数据
3 ——Object 对象,嵌套另外的文档
4 ——Array 值的集合或者列表可以表示成数组
5 ——Binary data 二进制
7 —— Object id 对象id是文档的12字节的唯一 ID 系统默认会自动生成
8 ——Boolean 布尔类型有两个值TRUE和FALSE
9 —— Date 日期类型存储的是从标准纪元开始的毫秒数。不存储时区
10 ——Null 用于表示空值或者不存在的字段
11 —— Regular expression 采用js 的正则表达式语法
13 ——JavaScript code 可以存放Javasript 代码
14 ——Symbol 符号
15 ——JavaScript code with scope
16 ——32-bit integer 32位整数类型 (NumberInt)
17 ——Timestamp 特殊语义的时间戳数据类型
18 ——64-bit integer 64位整数类型(NumberLong)