标签: pymongo

pymongo保存嵌入的objectIds,InvalidDocumentError

使用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嵌套在这样的文档中进行交叉引用?我误解了他们的目的吗?

python mongodb pymongo

1
推荐指数
1
解决办法
4795
查看次数

PyMongo奇怪错误"TypeError:'数据库'对象不可调用."

我有一个奇怪的错误.

资源: __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

1
推荐指数
1
解决办法
8855
查看次数

pymongo- upsert无法使用$ set操作执行插入

我有一个空集合,有数千个条目要处理(条目可能有减少,我想要使用更新和插入).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)

python upsert mongodb pymongo

1
推荐指数
1
解决办法
5599
查看次数

Mongodb阅读首选项

建立:

我有一个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的任何一个连接.如何强制以较低的延迟从实例获取连接

谢谢!!

mongodb pymongo

1
推荐指数
1
解决办法
3962
查看次数

REGEX在pymongo中搜索

我正在尝试使用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)

python regex mongodb pymongo

1
推荐指数
1
解决办法
1万
查看次数

pymongo中的Tailable光标似乎已停止工作

我已经成功地在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)

python mongodb pymongo

1
推荐指数
1
解决办法
1238
查看次数

在PyMongo中,如何找到文档的_id,否则插入并获取插入文档的_id

例如:

我有一个集合'故事',其中每个文档的形式如下:

{
  '_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)

这不是效率低,因为它会更新(修改)文档,即使它不是必需的吗?这可以提高效率

python mongodb pymongo python-2.7

1
推荐指数
1
解决办法
767
查看次数

mongodb exculde与数据匹配?

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

regex mongodb nosql pymongo mongodb-query

1
推荐指数
1
解决办法
1557
查看次数

使用Python将Pandas数据帧中的行作为单个文档插入到mongodb集合中

我一直在尝试将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 mongodb dataframe pymongo pandas

1
推荐指数
1
解决办法
5270
查看次数

在Python中生成一个没有分叉的进程

我正在使用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所以我想知道我是否遗漏了一些东西.

python subprocess python-2.x pymongo python-multiprocessing

1
推荐指数
1
解决办法
2144
查看次数