【发布时间】:2014-04-19 09:45:21
【问题描述】:
我有一个大约 500 万个文档的表格集合。它们如下所示:
fr to weight
对于fr 和to,我有6000 的可能值。我创建了以下代码来将所有可能的fr 字段的所有权重加到to,例如
1 1 sum(all documents with fr=1 to=1)
1 2 sum(all documents with fr=1 to=2)
...
我使用pyMongo 编写脚本,而cells 是所有可能的fr/to 字段的数组,calls 是我拥有大约500 万份文档的集合。
for _from in cells: #pair up each cell with each other cell
for _to in cells:
s = calls.aggregate([
{
'$match':
{
"fr": _from,
"to": _to
}
},
{
'$group': {'_id': 'null', 'sum': {'$sum':'$weight'}}
}])
if s['result']:
fr_to_sum = s['result'][0]['sum']
_id = entropy.insert({
'to': _to,
'fr': _from,
'sum': fr_to_sum
})
我用的是单机。
另一个数据库会更好吗?例如。一些 SQL?
更新
字段fr 和to 包含1-100000 范围内的整数,而weight 是一个小的float。我尝试在fr 和to 之间进行所有可能的组合并对这些组合的值求和,因为数据库中可能存在具有fr 和to 相同的重复文档(例如fr=1 to=2 weight=0.004 和@ 987654344@,所以在这种情况下,我想在我的entropy 表中有fr=1 to=2 weight=0.014。
只是作为一个示例
>> db.week_calls.count({'fr':10, 'to':102})
>> 4
拨打db.week_calls.getIndexes()后我得到了
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "db.week_calls",
"name" : "_id_"
}
这似乎很奇怪,因为我使用 db.calls.ensure_index([("fr",1), ("to",1)]) 创建并索引整个事物
【问题讨论】:
-
你有
fr和to的索引吗?您选择的“范围”中有多少文档匹配。 -
是的,我用过
db.calls.ensure_index([("fr",1), ("to",1)])。range是什么意思? -
通过添加您的
fr和to标准,有多少文档得到“匹配”。通过描述更多您正在尝试做的事情,您的问题也可能会得到更好的解释。您是否想要对fr和to的所有唯一值进行总计?
标签: sql mongodb mongodb-query aggregation-framework pymongo