我正在使用Google新发布的Gmail API的python版本.
以下调用仅返回消息ID列表:
service.users().messages().list(userId = 'me').execute()
Run Code Online (Sandbox Code Playgroud)
但后来我只有一个消息ID列表,需要迭代它们并逐个获取它们.
有没有办法在单个调用中获取id列表的整个消息内容?(类似于在Google Calendar API中完成的操作)?
如果还不支持,Google会考虑在API中添加这些内容吗?
这是适合我的解决方案:
batch = BatchHttpRequest()
for msg_id in message_ids:
batch.add(service.users().messages().get(userId = 'me', id = msg_id['id']), callback = mycallbackfunc)
batch.execute()
我有以下mongoengine型号:
class MyModel(Document):
date = DateTimeField(required = True)
data_dict_1 = DictField(required = False)
data_dict_2 = DictField(required = True)
Run Code Online (Sandbox Code Playgroud)
在某些情况下,DB中的文档可能非常大(大约5-10MB),而data_dict字段包含复杂的嵌套文档(dicts列表的字典等等).
我遇到过两个(可能是相关的)问题:
当我从数据库查询单个大型文档,然后访问其字段时,只需执行以下操作需要10-20秒:
m = MyModel.objects.first()
val = m.data_dict_1.get(some_key)
Run Code Online (Sandbox Code Playgroud)对象中的数据不包含对任何其他对象的任何引用,因此它不是取消引用的对象的问题.
我怀疑它与mongoengine的内部数据表示的某些低效率有关,这会影响文档对象的构造以及字段访问.我能做些什么来改善这个吗?
我有一个超过1,000,000条记录的MongoDB集合.每个记录大小约为20K(因此总集合大小约为20GB).
我在集合中有一个'type'字段(可以有大约10个不同的值).我想获得该系列的per-type计数器.此外,'type'字段有一个索引.
我测试了两种不同的方法(假设python语法):
for type_val in my_db.my_colc.distinct('type'):
counters[type_val] = my_db.my_colc.find({'type' : type_val}).count()
Run Code Online (Sandbox Code Playgroud)
counters = my_db.my_colc.aggregate([{'$group' : {'_id': '$type', 'agg_val': { '$sum': 1 } }}])
Run Code Online (Sandbox Code Playgroud)
我收到的第一种方法的性能比第二种方法快2个数量级.似乎与count只在索引上运行而不访问文档这一事实有关,而$ group必须逐个遍历文档.(大约1分钟对45分钟).
有没有办法在'type'索引上运行有效的分组查询,只使用索引,从而实现#1的性能结果,但是使用聚合框架?
我正在使用MongoDB 2.6.1
更新:https: //jira.mongodb.org/browse/SERVER-11447在MongoDB Jira中就此问题开放.
在副本模式下,对任何DB中的任何集合的每个写操作也会写入oplog集合.
现在,当并行写入多个DB时,所有这些写操作也会写入oplog.我的问题:这些写操作是否需要锁定oplog?(我正在使用w:1写关注).如果他们这样做,这有点类似于对所有不同DB的所有写操作之间的全局锁定,不是吗?
我很乐意得到任何暗示.
我有一个GAE数据存储表,其中包含一个数组字段(包含几个字符串).我想基于包含特定字符串的所有数组字段来过滤此表.我怎样才能做到这一点 ?我没有在GQL中看到'包含'运算符,而'in'运算符则以相反的方式运行.我只需要遍历所有实体并自己进行检查吗?
(PS我在GAE工作中使用Python).
我有一个 mongodb 集合,其中包含以下结构的文档(简化它,数字只是示例):
{'a' : 1, 'b' : {'c':2}}
我想运行以下 mongodb 查询:
{'$where' : 'this.a < this.b.c'}
以上是行不通的。这种查询的正确语法是什么?
我正在将辅助副本集成员升级到wiredTiger.我已将它从MongoDB 2.6.3升级到3.0.4并将存储引擎更改为wiredTiger.现在它正在重新同步主数据库中的所有数据.在某些时候收到以下错误,并且该过程重新开始:
2015-07-22T13:18:55.658 + 0000 I INDEX [rsSync]使用批量方法构建索引
2015-07-22T13:18:55.664 + 0000我完成了INDEX [rsSync]构建索引.共扫描了1591条记录.0秒
2015-07-22T13:18:56.397 + 0000 E STORAGE [rsSync] WiredTiger(24)[1437571136:397083] [20413:0x7f3d9ed29700],file:WiredTiger.wt,session.create:WiredTiger.turtle:fopen:打开太多档
2015-07-22T13:18:56.463 + 0000 E REPL [rsSync] 8 24:打开文件太多
2015-07-22T13:18:56.463 + 0000 E REPL [rsSync]初始同步尝试失败,剩余9次尝试
同一台机器之前运行的是2.6.3版本,没有任何打开文件限制问题.我知道wiredTiger可能会创建更多的文件,所以它必须是它,但它是否会同时打开它们?
以供参考:
cat/proc/sys/fs/file-max
10747371
在/etc/init.d/mongod中配置为:
ulimit -n 64000
根据文档,似乎mongo为每个数据文件保存文件描述符.与在wiredTiger中一样,这导致每个集合的文件+每个索引的文件,根据我们的用例计算,可以加起来超过700K.
所以我可以将ulimit更改为700000或更高,但我想知道这是否是最正确的解决方案,以及存在哪些替代方案.
在pymongo中,可以选择打开具有特定集合名称的GridFS.例如mygridfs = gridfs.GridFS(db, collection = mycolc)
.
我在MongoDB C#驱动程序(官方MongoDB最新驱动程序版本)中找不到类似的选项.
因此,如果我想在Python和C#模块之间共享GridFS数据,我只能使用DB中的默认GridFS(名为"fs").
是否可以在C#MongoDB驱动程序中以某种方式访问具有非默认名称的GridFS的任何线索?
mongodb ×6
pymongo ×4
python ×3
wiredtiger ×2
c# ×1
gmail-api ×1
google-api ×1
gql ×1
gqlquery ×1
mongoengine ×1
performance ×1
replicaset ×1
replication ×1