标签: pymongo

使用模拟MongoDB服务器进行单元测试

我必须使用MongoDB存储为Python代码实现nosetests.是否有任何python库允许我初始化一个模拟内存中的MongoDB服务器?

我正在使用持续集成.所以,我希望我的测试独立于任何运行MongoDB的服务器.有没有办法在内存中模拟mongoDM Server来独立于连接到Mongo服务器来测试代码?

提前致谢!

python mongodb pymongo python-2.7

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

更新具有不同值的多个文档的方法

我有以下文件:

[{
  "_id":1,
  "name":"john",
  "position":1
},
 {"_id":2,
  "name":"bob",
  "position":2
},
 {"_id":3,
  "name":"tom",
  "position":3
}]
Run Code Online (Sandbox Code Playgroud)

在UI中,用户可以改变项目的位置(例如,将Bob移动到第一位置,john获得位置2,tom-位置3).有没有办法一次更新所有文件中的所有职位?

mongodb nosql pymongo

15
推荐指数
3
解决办法
9728
查看次数

Mongo - 如何聚合,过滤和包含匹配文档中的数据数组?

我有一个mongo支持的联系人数据库,我试图以一堆不同的方式找到重复的条目.

例如,如果2个联系人具有相同的电话号码,则会将其标记为可能的副本,同样适用于电子邮件等.

我在Debian上使用MongoDB 2.4.2和pyMongo以及MongoEngine.

到目前为止,我最接近的是查找并计算包含相同电话号码的记录:

dbh.person_document.aggregate([
    {'$unwind': '$phones'},
    {'$group': {'_id': '$phones', 'count': {'$sum': 1}}},
    {'$sort': SON([('count', -1), ('_id', -1)])}
])

# Results in 
{u'ok': 1.0,
 u'result': [{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5}, u'count': 5},
             {u'_id': {u'number': u'205-265-6666', u'showroom_id': 5}, u'count': 5},
             {u'_id': {u'number': u'213-785-7777', u'showroom_id': 5}, u'count': 4},
             {u'_id': {u'number': u'334-821-9999', u'showroom_id': 5}, u'count': 3}
]}
Run Code Online (Sandbox Code Playgroud)

所以我可以得到重复的数字,但我不能为我的生活弄清楚如何返回实际包含这些项目的文档数组!

我想看到每个数字的这种返回数据:

# The ObjectIDs of the documents that contained the duplicate phone numbers
{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5}, 
  u'ids': [ObjectId('51c67e322b2192121ec4d8f2'), ObjectId('51c67e312b2192121ec4d8f0')], 
  u'count': 2},
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

mongodb pymongo aggregation-framework

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

为什么PyMongo会抛出AutoReconnect?

在研究我的Python Web应用程序的一些奇怪问题时(特别是有关MongoDB连接的问题),我在官方PyMongo文档页面上注意到了一些问题.我的Web应用程序使用Flask,但这不应该影响我面临的问题.

PyMongo驱动程序执行连接池,但是AutoReconnect当连接失效并且重新连接到期时,它也会抛出异常().

它声明(关于AutoReconnect异常):

为了自动重新连接,您必须处理此异常,并认识到导致它的操作未必成功.将来的操作将尝试打开与数据库的新连接(并将继续引发此异常,直到第一次成功建立连接).

我注意到这实际上经常发生(并且它似乎不是一个错误).MongoDB服务器在几分钟不活动之后关闭连接,并且需要由Web应用程序重新创建.

我不明白为什么PyMongo驱动程序重新连接时会抛出错误(驱动程序的用户需要自己处理),而不是透明地执行.(甚至有可能是一个选项,用户可以设置使AutoReconnect异常抛出,但将不是一个合理的默认是这些异常没有得到根本抛出,以及连接无缝重现?)

我从来没有遇到过使用其他数据库系统的这种行为,这就是为什么我有点困惑.

还值得一提的是,当连接到我的本地开发MongoDB服务器时,我的Web应用程序的MongoDB连接永远不会失败(我假设它与本地连接的事实有关,并且连接是通过UNIX套接字而不是通过UNIX套接字完成的一个网络套接字,但我可能是错的).

python mongodb pymongo

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

如何使用pymongo将日期时间字符串作为ISODate插入Mongodb

如何将这样的日期时间字符串"2017-10-13T10:53:53.000Z"作为ISODate 插入到mongo db中?插入时,我在mongodb中得到一个字符串: datetime.strptime("2017-10-13T10:53:53.000Z", "%Y-%m-%dT%H:%M:%S.000Z")

python pymongo

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

python + pymongo:如何在for循环中在mongo中的现有文档中插入新字段

我在python中使用for循环来循环查询pymongo的查询结果.这是代码:

from pymongo import MongoClient
connection = MongoClient()
db = connection.Test

myDocs = db.Docs.find( { "geolocCountry" : { "$exists" : False } } )

for b in myDrives:
    my_lat = b['TheGpsLog'][0]['latitude']
    my_long = b['TheGpsLog'][0]['longitude']

    myGeolocCountry = DoReverseGeocode(lat_start,long_start) 
    #    Here I perform a reverse geocoding, it does not matter for this example. 
    #    The important thing is: it returns a string, like 'US', 'UK', etc...
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何将变量myGeolocCountry插入geolocCountry现有文档(b)的非现有字段?

我试过了

b['geolocCountry'] = myGeolocCountry
Run Code Online (Sandbox Code Playgroud)

但它根本不起作用,它甚至不会产生错误.

谢谢

python insert mongodb pymongo

14
推荐指数
3
解决办法
2万
查看次数

使用OrderedDict时,"管道阶段规范对象必须包含一个字段"

我尝试运行聚合命令:

request = collections.OrderedDict([
        ("$unwind", "$tags" ),
        ("$group", { "_id" : "$tags" , "count" : { "$sum" : 1 }  } ),
        ("$project", { "_id" : 0, "tag" : "$_id" , "count" : 1 } ),
        ("$sort", { "count" : -1 } ),
        ("$limit", 3 )])

print client.devoxx.talks.aggregate(request)
Run Code Online (Sandbox Code Playgroud)

但MongoDB拒绝它:

pymongo.errors.OperationFailure: command SON([('aggregate', u'talks'), ('pipeline', [OrderedDict([('$unwind', '$tags'), ('$group', {'count': {'$sum': 1}, '_id': '$tags'}), ('$project', {'count': 1, '_id': 0, 'tag': '$_id'}), ('$sort', {'count': -1}), ('$limit', 3)])])]) failed: exception: A pipeline stage specification …
Run Code Online (Sandbox Code Playgroud)

mongodb pymongo

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

pymongo中的默认batchSize是什么?

我正在使用pymongo在一个查询中获取大约2M个文档,每个文档只包含三个字符串字段.查询只是一个简单的find(),没有任何limit()或batchSize().

在迭代光标时,我注意到脚本在处理大约25k文档后等待大约30~40秒.

所以我想知道mongo会在一批中返回所有2M结果吗?pymongo中的默认batchSize()是什么?

mongodb pymongo

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

迭代通过PyMongo Cursor作为键值对

是否有可能将pymongo Cursor作为键值对迭代dict?我正在使用python 2.6和pymongo 1.9.

我试过这个:

import pymongo
mongo = pymongo.Connection('localhost')
mongo_db = mongo['my_database']
mongo_coll = mongo_db['my_collection']
cursor = mongo_coll.find()
records = dict([(record_id, record) for record_id, record in mongo_cursor])
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

python mongodb pymongo

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

MongoDB:无法启动副本集; '已有数据,无法启动设置'

我有一个MongoDB实例,使用配置文件和密钥文件进行设置.

我想用pymongo启动一个副本集.当我尝试启动replcia集时,通过对将成为副本集主服务器的服务器执行python脚本,如下:

from pymongo import MongoClient

uri = "mongodb://correctWorkingUsername:password@localhost:27017"
c = MongoClient(uri)

config = {'_id': 'RelicaSetName', 'members': [
{'_id': 0, 'host': 'FirstServer:27017'},
{'_id': 1, 'host': 'SecondServer:27017'},
{'_id': 2, 'host': 'ThirdServer:27017'}]}

c.admin.command("replSetInitiate", config)
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息,如下:

'SecondSErver:27017' has data already, cannot initiate set
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用数据库进行身份验证

mongo admin -u correctWorkingUsername -p password
Run Code Online (Sandbox Code Playgroud)

我可以启动复制,并成功添加成员:

rs.initiate()
rs.add('SecondServer:27017')
Run Code Online (Sandbox Code Playgroud)

我不确定这是否与密钥文件身份验证有关,或者是否由用户脚本在其他服务器上创建了ALREADY.每个服务器也都使用配置文件mongod.conf启动,该文件包含副本集名称.

为什么这会失败?rs.initiate()和rs.add()完美地工作,但python脚本虽然可以实际连接到数据库但不起作用.

python mongodb pymongo replicaset

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