python - 为什么 db.insert(dict) 在使用 pymongo 时将 _id 键添加到 dict 对象

标签 python mongodb dictionary pymongo

我通过以下方式使用 pymongo:

from pymongo import *
a = {'key1':'value1'}
db1.collection1.insert(a)
print a

这打印

{'_id': ObjectId('53ad61aa06998f07cee687c3'), 'key1': 'value1'}

在控制台上。 我知道 _id 已添加到 mongo 文档中。但是为什么它也被添加到我的 python 字典中呢?我不打算这样做。我想知道这样做的目的是什么?我可以将这本词典用于其他目的,并且将词典更新为将其插入文档的副作用吗?例如,如果我必须将这个字典序列化为一个 json 对象,我将得到一个

ObjectId('53ad610106998f0772adc6cb') is not JSON serializable

错误。在数据库中插入文档时,插入函数不应该保持字典的值相同。

最佳答案

与许多其他数据库系统一样,Pymongo 将添加必要的唯一标识符,以便在插入数据后立即从数据库中检索数据(如果插入两个具有相同内容的字典会发生什么 {'key1' :'value1'} 在数据库中?您如何区分您想要这个而不是那个?)

这在 Pymongo docs 中有解释:

When a document is inserted a special key, "_id", is automatically added if the document doesn’t already contain an "_id" key. The value of "_id" must be unique across the collection.

如果你想改变这个行为,你可以在插入之前给对象一个 _id 属性。在我看来,这是个坏主意。这很容易导致碰撞,并且您会丢失存储在“真实”ObjectId 中的多汁信息。 ,例如 creation time ,这非常适合排序之类的事情。

>>> a = {'_id': 'hello', 'key1':'value1'}
>>> collection.insert(a)
'hello'
>>> collection.find_one({'_id': 'hello'})
{u'key1': u'value1', u'_id': u'hello'}

或者如果序列化为 Json 时出现问题,您可以使用 utilities在 BSON 模块中:

>>> a = {'key1':'value1'}
>>> collection.insert(a)
ObjectId('53ad6d59867b2d0d15746b34')
>>> from bson import json_util
>>> json_util.dumps(collection.find_one({'_id': ObjectId('53ad6d59867b2d0d15746b34')}))
'{"key1": "value1", "_id": {"$oid": "53ad6d59867b2d0d15746b34"}}'

(您可以在 jsonlint.com 等页面中验证这是有效的 json)

关于python - 为什么 db.insert(dict) 在使用 pymongo 时将 _id 键添加到 dict 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24452056/

相关文章:

python - mongodb 集合中出现次数最多的文档

C++ Comparator 函数指定映射的特定键顺序?

javascript - 在javascript中访问Java Map的键值对

python scrapy登录重定向问题

node.js - Mongodb 聚合或投影

java - Spring 应用程序将文档保存到测试数据库而不是自定义数据库

swift - 如何交换字典中的项目

python - Gunicorn,没有名为“myproject”的模块

python - 如果没有,如何优雅地在子字符串周围添加空格?

python - PySpark 减少按键?添加键/元组