Python Pymongo/Mongodb聚合端
我收集了以下文件: {{u-id:[唯一的id],孩子:['unique-id','unique-id','unique-id','unique-id','unique-id'] 虽然每个文档都有多个字段,但我只关心_id和child,因此要重点关注它(其中_id是父对象和子对象的_id,是对应于子对象的id数组) 我收集了200多万份文件,我正在寻找的是检索这些记录的最佳方法(即最快的方法)。我最初尝试的10万份文档如下所示: --普通聚合:Python Pymongo/Mongodb聚合端,python,mongodb,pymongo,Python,Mongodb,Pymongo,我收集了以下文件: {{u-id:[唯一的id],孩子:['unique-id','unique-id','unique-id','unique-id','unique-id'] 虽然每个文档都有多个字段,但我只关心_id和child,因此要重点关注它(其中_id是父对象和子对象的_id,是对应于子对象的id数组) 我收集了200多万份文件,我正在寻找的是检索这些记录的最佳方法(即最快的方法)。我最初尝试的10万份文档如下所示: --普通聚合: t = coll.aggregate([{'$pr
t = coll.aggregate([{'$project': {'_id': 1, 'kids': 1}},
{'$limit' : 100000},
{'$group': {'_id': '$_id', 'kids': {'$push': "$kids"}}}
])
为每个_id聚合大约需要85秒
--具有条件的聚合:
在某些文档中,缺少kids字段,因此为了获取所有相关文档,我将设置$match和$exists功能:
t = coll.aggregate([{'$project': {'_id': 1, 'kids': 1}},
{'$match': {'kids': {'$exists': True}}},
{'$limit' : 100000},
{'$group': {'_id': '$_id', 'kids': {'$push': "$kids"}}}
])
10万条记录大约需要190秒
--带查找的递归:
我使用的第三种技术是找到所有文档并将它们附加到字典中,并确保它们不会重复(因为有些孩子也是父母)…因此从双亲开始并递归:
def agg(qtc):
qtc = [_id, _id]
for a in qtc:
for b in coll.find({'kids': {'$exists': True}, '_id': ObjectId(a)}, {'_id': 1, 'kids': 1}):
t.append({'_id': str(a['_id']), 'kids': [str(c) for c in b['kids']]})
t = [dict(_id=d['_id'], kid=v) for d in t for v in d['kids']]
t = [dict(tupleized) for tupleized in set(tuple(item.items()) for item in t)]
#THE ABOVE TWO LINES ARE FOR ASSIGNING EACH ID WITH EACH 'KID', SO THAT, IF AN ID HAS
#FOUR KIDS, THEN THE RESULTING ARRAY CONTAINS FOUR RECORDS FOR THAT ID WITH EACH
#HAVING A SINGLE KID.
for a in flatten(t):
if a['kid'] in qtc:
print 'skipped'
continue
else:
t.extend(similar_once([k['kid'] for k in t]))
return t
对于这个特殊的一个,时间仍然未知,因为我无法准确地计算如何实现这一点
因此,我们的目标是在尽可能短的时间内让所有父母的所有孩子(有些孩子也是父母)。再次提到,我测试了多达10万条记录,我有200多万条记录。任何帮助都会很好。谢谢 每个文档的_id都是唯一的,因此按_id分组没有任何作用:唯一的文档进入,相同的唯一文档出来。一个简单的查找即可满足您的所有需要:
for document in coll.find(
{'_id': {'$in': [ parent_id1, parent_id2 ]}},
{'_id': True, 'kids': True}):
print document
我个人很想进行聚合,但它花费的时间扼杀了这个想法。。我建议您在kids字段上添加一个稀疏索引,并按照如下方式重写聚合查询:t=coll.aggregate([{'$match':{'kids':{'$exists':True}}}},{'$limit':100000},{'$project':{''uid':1','kids':1},{'$group':{'''u id':'$'u id','kids':{'$push':“$kids”}}}}])投影会创建新文档,尤其是在您刚刚重命名它们的情况下。这意味着不使用原始集合的索引。索引中是否有$'id和kids?尝试在开始时不使用投影运行聚合…这有助于提高速度吗?