【发布时间】:2014-05-15 03:55:21
【问题描述】:
我有一个庞大的 MongoDB 集合(约 50 万份文档)。
结构是这样的:
{'_id': '.....',
'passid':'ag325gdtew',
'text': '.......',
'count': '.......',
'title': '......',
'body': '.......'
}
passid 字段在许多文档中是相同的,我想将它们与每个字段的不同方式结合起来。
我想:
- 保持不变
passid - 在每个文档中加入文本和标题(文本+标题),然后在新文档的一个字段中加入最终字符串(文本1+文本2+文本3)
- 为每个计数创建一个字段列表 [count1, count2, count3]
- 删除正文字段
所以新的文档会是这样的:
{'_id': '.....',
'passid':'ag325gdtew',
'text': '.......', (string)
'count': ['..','...','..'] (list)
}
目前,我正在使用 Python 执行此操作,但文件很大,脚本会持续运行数小时。
我做了什么:
- 与组聚合以检索具有唯一
passid的列表 - 在该列表中迭代每个
passid - 使用 find(
passid) 检索具有相同passid的所有文档的游标 - 用python对字符串和列表进行连接和追加
- 删除旧文档
- 保存新的
正如我所说,这真的很耗时。你知道有什么更快的方法吗?
代码如下:
passids= db.collection.aggregate({ "$group": {"_id": '$passid'}})
for i in passids['result']:
doc = {}
doc['passid'] = i['_id']
documents = db.collection.find({"passid": i['_id']})
doc['count'] = []
doc['text'] = ""
for d in documents:
doc['text'] = doc['text'] + " " + d['text']
doc['text'] = doc['text'] + " " + d['title']
doc['count'].append(d['count'])
db.collection.remove(d)
db.collection.save(doc)
【问题讨论】:
-
您实际上并没有指出哪个部分“耗时”或您实际想要的结果是什么。我们可以假设您正在尝试将文档“重新组合”成一个新集合。你能展示你在做什么工作吗?并说明这是一项“一次性”任务还是您在问题中经常需要做的事情。
-
这是我只会做一次的事情。我认为我的解释清楚地说明了我的做法。但我会在一分钟后在这里发布代码。