私はjson形式のいくつかのOSMデータからいくつかの洞察を集めようとしています。ここで私はMongoDBの/ PyMongoで使用している文書の例です:MongoDB。集計パイプラインを使用して計算フィールドを運ぶ方法
{"amenity": "post_office",
"name": "Dominion Road Postshop",
"created": {"uid": "10829",
"changeset": "607706",
"version": "5",
"user": "myfanwy",
"timestamp": "2007-11-24T12:41:04Z"},
"pos": [-36.8801299, 174.7495053],
"created_by": "Potlatch 0.5d",
"type": "node",
"id": "61076379"}
したがって、各文書には、ユーザーやアメニティがあります。私は、各ユーザーが記録するアメニティの数を、各ユーザーが記録するアメニティの合計で割って求めます。
クエリ1.各ユーザレコードの各アメニティの何を見つける:
amenity_per_user = coll.aggregate([{"$match":{"amenity":{"$exists":True}}},
{"$group":{"_id":{"user":"$created.user", "amenities":"$amenity"}, "count":{"$sum":1}}},
{"$sort":{"count":-1}}])
クエリ2をので、ここで明確にするのに役立つ
は、私は、個々の数を見つけるために使用したいコードスニペットです。
:(5つの結果それぞれに限定される)results = coll.aggregate([{"$match":{"amenity":{"$exists":True}}},
{"$group":{"_id":"$created.user", "count":{"$sum":1}}},
{"$sort":{"count":-1}}])
そして両方のための答え:どのように多くの設備、各ユーザレコードの検索
Finding how many of each amenity each user records:
{u'_id': {u'amenities': u'parking', u'user': u'Rudy355'}, u'count': 1886}
{u'_id': {u'amenities': u'post_box', u'user': u'Rudy355'}, u'count': 547}
{u'_id': {u'amenities': u'telephone', u'user': u'Rudy355'}, u'count': 485}
{u'_id': {u'amenities': u'parking', u'user': u'myfanwy'}, u'count': 451}
{u'_id': {u'amenities': u'restaurant', u'user': u'Rudy355'}, u'count': 429}
Find how many amenities each user records:
{u'_id': u'Rudy355', u'count': 6321}
{u'_id': u'myfanwy', u'count': 951}
{u'_id': u'Robert Ancell', u'count': 599}
{u'_id': u'lcmortensen', u'count': 366}
{u'_id': u'Marks2000', u'count': 228}
ここで私がしたいことは、各ユーザのトップアメニティ(すなわち、駐車施設のための1886エントリを作成したRudy355)の合計量を、記録の合計量(クエリ2)で割ることです。 - その結果、Rudy355は彼の録音の0.3倍を「駐車場」アメニティで作ったことになります。 - 1886/6321 = 0.3。すべてのヘルプは素晴らしいだろう
coll.aggregate([{"$match":{"amenity":{"$exists":True}}},
{"$group":{"_id":"$created.user", "user_count":{"$sum":1}}},
{"$group":{"_id":{"user":"$created.user", "amenities":"$amenity"}, "amenity_count":{"$sum":1},
"ucount":{"$push":"$user_count"}}},
{"$unwind":"$ucount"},
{"$project":{"$divide":{"$ucount", "$amenity_count"}}},
{"$sort":{"count":-1}}])
:
これは私が持っているものです!
ところで、私は実際には、$ pushを使用して 'user_count'の値を保存するというアイデアが気に入らないのです。誰もがそれのような計算フィールドを保存するより良い方法を知っていますか?
ありがとうございました。すべて今働いている –