MongoDB find命令匹配数据,匹配内容和检索条件不一致

本文探讨了在使用Pymongo操作MongoDB时遇到的关于数据类型的常见问题,特别是长整型和整型在检索过程中的区别,以及如何正确地设置唯一索引和更新字段。

一、问题

使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值