Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pymongo/Mongodb聚合端_Python_Mongodb_Pymongo - Fatal编程技术网

Python Pymongo/Mongodb聚合端

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

我收集了以下文件:

{{u-id:[唯一的id],孩子:['unique-id','unique-id','unique-id','unique-id','unique-id']

虽然每个文档都有多个字段,但我只关心_id和child,因此要重点关注它(其中_id是父对象和子对象的_id,是对应于子对象的id数组)

我收集了200多万份文件,我正在寻找的是检索这些记录的最佳方法(即最快的方法)。我最初尝试的10万份文档如下所示:

--普通聚合:

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?尝试在开始时不使用投影运行聚合…这有助于提高速度吗?