我必须使用MongoDB存储为Python代码实现nosetests.是否有任何python库允许我初始化一个模拟内存中的MongoDB服务器?
我正在使用持续集成.所以,我希望我的测试独立于任何运行MongoDB的服务器.有没有办法在内存中模拟mongoDM Server来独立于连接到Mongo服务器来测试代码?
提前致谢!
我有以下文件:
[{
"_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).有没有办法一次更新所有文件中的所有职位?
我有一个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)
任何帮助是极大的赞赏!
在研究我的Python Web应用程序的一些奇怪问题时(特别是有关MongoDB连接的问题),我在官方PyMongo文档页面上注意到了一些问题.我的Web应用程序使用Flask,但这不应该影响我面临的问题.
PyMongo驱动程序执行连接池,但是AutoReconnect当连接失效并且重新连接到期时,它也会抛出异常().
它声明(关于AutoReconnect异常):
为了自动重新连接,您必须处理此异常,并认识到导致它的操作未必成功.将来的操作将尝试打开与数据库的新连接(并将继续引发此异常,直到第一次成功建立连接).
我注意到这实际上经常发生(并且它似乎不是一个错误).MongoDB服务器在几分钟不活动之后关闭连接,并且需要由Web应用程序重新创建.
我不明白为什么PyMongo驱动程序重新连接时会抛出错误(驱动程序的用户需要自己处理),而不是透明地执行.(甚至有可能是一个选项,用户可以设置使AutoReconnect异常不抛出,但将不是一个合理的默认是这些异常没有得到根本抛出,以及连接无缝重现?)
我从来没有遇到过使用其他数据库系统的这种行为,这就是为什么我有点困惑.
还值得一提的是,当连接到我的本地开发MongoDB服务器时,我的Web应用程序的MongoDB连接永远不会失败(我假设它与本地连接的事实有关,并且连接是通过UNIX套接字而不是通过UNIX套接字完成的一个网络套接字,但我可能是错的).
如何将这样的日期时间字符串"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中使用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)
但它根本不起作用,它甚至不会产生错误.
谢谢
我尝试运行聚合命令:
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) 我正在使用pymongo在一个查询中获取大约2M个文档,每个文档只包含三个字符串字段.查询只是一个简单的find(),没有任何limit()或batchSize().
在迭代光标时,我注意到脚本在处理大约25k文档后等待大约30~40秒.
所以我想知道mongo会在一批中返回所有2M结果吗?pymongo中的默认batchSize()是什么?
是否有可能将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) 我有一个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脚本虽然可以实际连接到数据库但不起作用.