所以我是mongodb和mapreduce的新手,并且遇到了这个"怪癖"(或者至少在我看来是个怪癖)
假设我的集合中有对象如下:
{'key':5,'value':5}
{'key':5,'value':4}
{'key':5,'value':1}
{'key':4,'value':6}
{'key':4,'value':4}
{'key':3,'value':0}
我的地图功能只是发出键和值
我的reduce函数只是在返回它们之前添加了值AND并添加1(我这样做是为了检查是否甚至调用了reduce函数)
我的结果如下:
{'_ id':3,'值':0 }
{'_ id':4,'价值':11.0}
{'_ id':5,'价值':11.0}
正如你所看到的,对于键4和5,我得到了键3的预期答案11 BUT(在该键的集合中只有一个条目)我得到了意想不到的0!
这是mapreduce的一般自然行为吗?对于MongoDB?对于pymongo(我正在使用)?
如果密钥==无或密钥不存在,我想使用条件查找文档.像这样的东西:
myDoc = self.request.root.db.myDocs.find_one({
'$or': [
{'myKey' : $doesNotExist } ,
{'myKey' : None }
]
})
Run Code Online (Sandbox Code Playgroud)
我还希望能够通过丢失的密钥找到一个文档,如下所示:
myDoc = self.request.root.db.myDocs.find_one( {'myKey' : $doesNotExist } )
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
我需要存储数十亿个小数据结构(每个大约200个字节).到目前为止,将每个元素存储为单独的文档运行良好,Mongo每秒提供大约10,000个结果.我使用20字节哈希作为每个文档的_id,以及_id字段上的单个索引.在测试中,这适用于具有5,000,000个文档的数据集.
在操作中,我们将每秒发出大约10,000个请求,每秒更新现有文档大约1,000次,并且每秒插入新文档可能大约100次或更少.
当我们无法在RAM中存储整个索引时,我们如何管理更大的数据集?如果我们将几个元素组合到每个文档中,MongoDB会表现得更好 - 为了更快地搜索索引,但每个查询中返回的数据更多?
与SO上的其他问题不同,我不仅对我们可以填充到Mongo的数据感兴趣.它可以清楚地管理我们正在查看的数据量.我担心的是find,考虑到RAM的限制,我们如何才能最大限度地提高大型集合的操作速度.
我们的搜索将倾向于聚集; 大约50,000个元素将满足约50%的查询,但剩余的50%将随机分布在所有数据中.我们可以通过将这些50%移动到他们自己的集合中来获得性能提升,以便将最常用数据的较小索引保持在ram中吗?
将_id字段的大小从20字节减小到8字节会对MnogoDB的索引速度产生重大影响吗?
我正在编写一个连接到数据库的应用程序.我想创建一次db连接,然后在应用程序的整个生命周期中重用该连接.
我还想验证用户身份.用户的身份验证仅在请求的生命周期内生效.
如何区分在烧瓶应用程序生命周期中存储的对象与特定于请求的对象?我在哪里存储它们以便所有模块(以及随后的蓝图)都可以访问它们?
这是我的示例应用程序:
from flask import Flask, g
app = Flask(__name__)
@app.before_first_request
def setup_database(*args, **kwargs):
print 'before first request', g.__dict__
g.database = 'DATABASE'
print 'after first request', g.__dict__
@app.route('/')
def index():
print 'request start', g.__dict__
g.current_user = 'USER'
print 'request end', g.__dict__
return 'hello'
if __name__ == '__main__':
app.run(debug=True, port=6001)
Run Code Online (Sandbox Code Playgroud)
当我运行它(Flask 0.10.1)并导航到http://localhost:6001/,这是控制台中显示的内容:
$ python app.py
* Running on http://127.0.0.1:6001/
* Restarting with reloader
before first request {}
after first request {'database': 'DATABASE'}
request start {'database': 'DATABASE'}
request …Run Code Online (Sandbox Code Playgroud) 我使用python包pymongo从mongodb数据库中检索数据.
>>> r = collection.find() # returns an object of class 'Cursor'
Run Code Online (Sandbox Code Playgroud)
然后我转换成一个列表
>>> l = list(r) # returns a 'list' of 'dict'
Run Code Online (Sandbox Code Playgroud)
这是print(l)返回的内容:
>>> [{u'date': datetime.datetime(2009, 11, 10, 10, 45), u'_id': 1, u'name': u'name1', u'value': 11},{u'date': datetime.datetime(2013, 11, 10, 10, 45), u'_id': 2, u'name': u'name2', u'value': 22}]
Run Code Online (Sandbox Code Playgroud)
现在我需要转换为JSON,以便我可以操作它.
>>> json.dumps(l)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
return _default_encoder.encode(obj)
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
chunks = self.iterencode(o, _one_shot=True) …Run Code Online (Sandbox Code Playgroud) 我使用MongoDB作为Python Web应用程序的后端数据库(PyMongo + Bottle).用户可以上传文件,并可选择在上传过程中"标记"这些文件.标签作为列表存储在文档中,如下所示:
{
"_id" : ObjectId("561c199e038e42b10956e3fc"),
"tags" : [ "tag1", "tag2", "tag3" ],
"ref" : "4780"
}
Run Code Online (Sandbox Code Playgroud)
我试图允许用户将新标签附加到任何文档.我提出了这样的事情:
def update_tags(ref, new_tag)
# fetch desired document by ref key as dict
document = dict(coll.find_one({'ref': ref}))
# append new tag
document['tags'].append(new_tag)
# re-insert the document back into mongo
coll.update(document)
Run Code Online (Sandbox Code Playgroud)
(fyi; refkey总是唯一的.这也很容易_id.)似乎应该有一种方法可以直接更新'tags'值而不需要拉回整个文档并重新插入.我在这里错过了什么吗?
任何想法都非常感谢:)
我想在Mongo DB中的特定字段启用文本搜索.我想在python( - > pymongo)中实现这个搜索.当我按照互联网上的说明操作时:
db.foo.ensure_index(('field_i_want_to_index', 'text'), name="search_index")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Traceback (most recent call last):
File "CVE_search.py", line 8, in <module>
db.foo.ensure_index(('field_i_want_to_index', 'text'), name="search_index")
File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 1599, in ensure_index
return self.create_index(key_or_list, cache_for, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 1466, in create_index
index_doc = helpers._index_document(keys)
File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 100, in _index_document
for (key, value) in index_list:
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
在pymongo中创建索引有不同/更好的方法吗?
我有一些文件,如:
{
_id: 5,
vals: [100, 1100, 1500]
},
{
_id: 10,
vals: [1100, 1700]
}
Run Code Online (Sandbox Code Playgroud)
如何在vals字段中查询具有以下内容的文档:
我可以使用一些理解魔法:
g = lambda codes: (
d for d in collection.find() if any(code in d["vals"] for code in codes)
)
g([100, 1700]).next()
Run Code Online (Sandbox Code Playgroud)
或者,对于AND:
g = lambda codes: (
d for d in collection.find() if all(code in d["vals"] for code in codes)
)
g([100, 1100]).next()
Run Code Online (Sandbox Code Playgroud)
虽然如果有一些可以用驱动程序完成的魔法,这似乎有点笨拙.
我将从这里使用这个例子
{
_id: 1,
zipcode: 63109,
students: [
{ name: "john", school: 102, age: 10 },
{ name: "jess", school: 102, age: 11 },
{ name: "jeff", school: 108, age: 15 }
]
}
{
_id: 2,
zipcode: 63110,
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: 100, age: 8 },
]
}
{
_id: 3,
zipcode: 63109,
students: [
{ name: "ajax", school: 100, age: 7 },
{ name: "achilles", school: …Run Code Online (Sandbox Code Playgroud) 我已经安装了mongodb并启用了auth.和它的工作发现.我可以使用robomongo应用程序从远程笔记本连接它:
Host: SERVER_IP
PORT: 27017
DATEBASE: prod-db
USERNAME: user_name
PASS: user_password
Auth Mechanism: MONGODB-CR
Run Code Online (Sandbox Code Playgroud)
我们可以使用以下方式从本地连接服务器shell:
$ mongo prod-db -u user_name -p user_password
Run Code Online (Sandbox Code Playgroud)
一切正常,但是当我们尝试使用pymongo api时.身份验证失败.下面是python代码:
from pymongo import MongoClient
client = MongoClient()
client.prod_db.authenticate('user_name', 'user_password', mechanism='MONGODB-CR')
db = client.prod_db
result = db.users.find()
for document in result:
print(document)
Run Code Online (Sandbox Code Playgroud)
使用的工具:
python 2.7
pymongo versiob 3.3.1
MongoDB shell version: 2.6.10
$ mongod --version
db version v2.6.10
2016-10-31T16:34:59.868+0000 git version: nogitversion
2016-10-31T16:34:59.868+0000 OpenSSL version: OpenSSL 1.0.2g 1 Mar 2016
Run Code Online (Sandbox Code Playgroud)
错误跟踪:
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) mongodb ×10
pymongo ×10
python ×6
flask ×1
fuzzy-search ×1
indexing ×1
key-value ×1
mapreduce ×1
rpython ×1
scalability ×1
search ×1
text-search ×1