使用pymongo驱动程序裸连接python到mongodb,为什么使用ObjectId实例作为嵌入文档的键会引发InvalidDocument错误?
我试图使用objectids链接文档,似乎无法理解为什么我想将它们转换为字符串,当为驱动程序自动创建的是ObjectId实例时.
item = collection.find({'x':'foo'})
item['otherstuff'] = {pymongo.objectid.ObjectId() : 'data about this link'}
collection.update({'x':'foo'}, item)
bson.errors.InvalidDocument: documents must have only string keys, key was ObjectId('4f0b5d4e764df61c67000000')
Run Code Online (Sandbox Code Playgroud)
在实践中,链接的id表示包含问题的文档,例如,字典中的键值为"otherstuff",表示该单个文档对该特定问题的响应.
是否有一个理由应用这样的objectids将不会编码成bson然后失败?是否无法将ObjectIds嵌套在这样的文档中进行交叉引用?我误解了他们的目的吗?
我有一个奇怪的错误.
资源:
__init__.py
import os
import base64
import uuid
import tornado.web
import tornado.httpserver
import tornado.locale
import tornado.ioloop
import tornado.options
from tornado.options import define, options
from pymongo.connection import Connection
from pymongo.database import Database
from handlers import api
#from auth import AuthLoginHandler
#from auth import AuthLogoutHandler
#from auth import AuthFirstRunHandler
from handlers import home
## Options
define("listen_port", default = 7456, type = "int",
help = "bind to port")
define("listen_address", default = None, type = "string",
help = "bind to address")
define("static_path", default …Run Code Online (Sandbox Code Playgroud) 我有一个空集合,有数千个条目要处理(条目可能有减少,我想要使用更新和插入).python代码(使用pymongo)我写道:
for mydoc in alldocs:
key = {'myid': mydoc['myid']}
data = process_doc(mydoc) # returns simple dictionary
db.mydocs.update(key, {"$set": data}, upsert = True)
Run Code Online (Sandbox Code Playgroud)
以下代码无法执行任何插入操作.该系列仍然是空的.但是,当我删除$ set并使用简单的数据时,它工作正常.我不能在upsert中使用$ set吗?我想要$ set的原因是BSON的预先存在的字段不会受到影响.有人可以指导.我真的无法弄清楚该怎么做.
可重现代码:
from pymongo import Connection
DB_CONTENT_BASE_KEY = 'contentbase'
def connect_to_db(dbname, hostname = 'localhost', portno = 27017, **kwargs):
connection = Connection(hostname, portno)
dbConnection = connection[dbname]
return dbConnection
class MetawebCustomCollectionBuilder(object):
# key ought to be a dictionary to filter results from contentbase.
def __init__(self, inDbConfig, outDbConfig, key = {}, verbose = False):
self.verbose = verbose
self.inDbConfig …Run Code Online (Sandbox Code Playgroud) 建立:
我有一个PRIMARY和两个SECONDARY mongodb实例.其中一个辅助实例与我的Web应用程序托管在同一区域中.
我正在使用pymongo进行连接.
查询:
如何以较低的延迟连接到SECONDARY.
目前我这样做:
from pymongo import ReplicaSetConnection
from pymongo import ReadPreference
db = ReplicaSetConnection('localhost:27017', replicaSet='rs1')['my_db']
db.read_preference = ReadPreference.SECONDARY
Run Code Online (Sandbox Code Playgroud)
我得到了SECONDARY的任何一个连接.如何强制以较低的延迟从实例获取连接
谢谢!!
我正在尝试使用REGEX在pymongo中创建搜索.匹配后,我希望将数据附加到模块中的列表.我认为我已经完成了所有设置,但无论我为REGEX设置什么,它都会返回0结果.代码如下:
REGEX = '.*\.com'
def myModule(self, data)
#after importing everything and setting up the collection function in the DB I call the following:
cursor = collection.find({'multiple.layers.of.data' : REGEX})
data = []
for x in cursor:
matches.append(x)
return matches
Run Code Online (Sandbox Code Playgroud)
这只是我用来过滤大量存储在mongodb中的json文件的三个模块.但是,无论我多少次更改此格式(如/.*.com/)以在操作中声明或使用mongo中的$ regex ...它都不会找到我的数据并将其附加到列表中.
编辑:添加完整的代码以及我想要识别的内容:
RegEx = '.*\.com' #Or RegEx = re.compile('.*\.com')
def filterData(self, data):
db = self.client[self.dbName]
collection = db[self.collectionName]
cursor = collection.find({'data.item11.sub.level3': {'$regex': RegEx}})
data = []
for x in cursor:
data.append(x)
return data
Run Code Online (Sandbox Code Playgroud)
我试图解析mongodb中的JSON数据.数据的结构如下:
"data": {
"0": {
"item1": "something", …Run Code Online (Sandbox Code Playgroud) 我已经成功地在Pymongo使用了2年的tailable游标,但突然间,今天,我的相同代码抛出了"意外的关键字"错误:

我几周前升级到3.0 Mongo并且它仍然工作正常,但是现在可能是一个新的pymongo版本,因为我今天刚刚安装了新版本(3.0.1)?以前是pymongo 2.6.3.我的代码:
cursor = refreq.find(tailable = True, await_data = True)
while cursor.alive:
xxx
Run Code Online (Sandbox Code Playgroud)
所以基本上任何时候插入refreq集合的东西我想知道它,没有轮询.习惯工作正常.最近安装了Pymongo 3.0.1版(今天).
试图插入一个空的字典
cursor = refreq.find({}, tailable = True, await_data = True)
Run Code Online (Sandbox Code Playgroud)
但仍然给出相同的错误.有什么变化?
这是完整的线程代码,供参考:
def handleRefRequests(db, refqueue):
""" handles reference data requests. It's threaded. Needs the database id.
will create a capped collection and constantly poll it for new requests"""
print("Dropping the reference requests collection")
db.drop_collection("bbrefrequests")
print("Recreating the reference requests collection")
db.create_collection("bbrefrequests", capped = True, size = 100 * 1000000) # x * megabytes
refreq …Run Code Online (Sandbox Code Playgroud) 例如:
我有一个集合'故事',其中每个文档的形式如下:
{
'_id': <default>
'story': <some very long string which should be unique in the collection>
}
Run Code Online (Sandbox Code Playgroud)
现在每当我有一个故事时,如果它已经存在于'故事'中,我想要它的'_id',否则插入一个带有'story'字段集的新文档,并得到它的'_id'
我能想到的是:
story = "this is a very long story"
id = stories_col.find_one_and_update({
'story': story,
}, {
'story': story,
}, upsert=True, return_document=ReturnDocument.AFTER)['_id']
Run Code Online (Sandbox Code Playgroud)
这不是效率低,因为它会更新(修改)文档,即使它不是必需的吗?这可以提高效率
mongodb中有一些数据:
{'name': 'bob', age: 12}
{'name': 'sam': age: 34}
{'name': 'byaelle': age: 22}
Run Code Online (Sandbox Code Playgroud)
如果我想获取名称的数据包括am
我可以使用
{'name': {'$regex': 'am'}}
Run Code Online (Sandbox Code Playgroud)
但是,如何才能获取名称数据am?
我一直在尝试将pandas数据帧的行作为单独的文档插入到mongodb集合中.我使用pymongo从MongoDB中提取数据,执行一些转换,运行评分算法,并将分数作为附加列添加到数据帧.最后一步是将行作为单独的文档插入到mongoDB数据库的特殊集合中,但我完全被卡住了.我的示例数据帧df看起来像这样.
memberID dxCodes dxCount score
0 856589080 [4280, 4293, 4241, 4240, 4242, 4243] 6 1.8
1 906903383 [V7612] 1 2.6
2 837210554 [4550, 4553, V1582] 3 3.1
3 935634391 [78791, 28860, V1582, 496, 25000, 4019] 6 1.1
4 929185103 [30500, 42731, 4280, 496, 59972, 4019, 3051] 7 2.8
Run Code Online (Sandbox Code Playgroud)
MemberID是一个字符串,dx代码是一个数组(在MongoDB术语中),dxCount是一个int,得分是一个浮点数.我一直在用我发现的一段代码来回应一个模糊的类似问题.
import json
import datetime
df = pandas.DataFrame.from_dict({'A': {1: datetime.datetime.now()}})
records = json.loads(df.T.to_json()).values()
db.temp.insert_many(records)
Run Code Online (Sandbox Code Playgroud)
这是我能够在我的收藏中得到的:
{
"_id" : ObjectId("565a8f206d8bc51a08745de0"),
"A" : NumberLong(1448753856695)
}
Run Code Online (Sandbox Code Playgroud)
它并不多,但它和我一样接近.我花了很多时间在谷歌上搜索并在黑暗中拍摄但尚未破解它.非常感谢任何指导,感谢您的帮助!
我正在使用Python(2.7)和pymongo(3.3),我需要生成一个子进程来异步运行一个作业.不幸的是pymongo不像这里描述的那样是fork-safe (我需要在生成子进程之前与db进行交互).
我运行了一个实验subprocess.Popen(使用shellset to True然后False)和multiprocessing.Process.据我所知,他们都分叉父进程来创建子进程,但只multiprocessing.Process导致pymongo打印它已检测到分叉进程的警告.
我想知道这样做的pythonic方式是什么.似乎也许os.system会为我做这件事,但subprocess被描述为一个预定的替代品,os.system所以我想知道我是否遗漏了一些东西.
pymongo ×10
mongodb ×8
python ×8
regex ×2
dataframe ×1
nosql ×1
pandas ×1
python-2.7 ×1
python-2.x ×1
subprocess ×1
upsert ×1