2018年08月26日

言語処理100本ノックでPython入門 #67 - MongoDBで複数ドキュメントの取得

  

今日は、言語処理100本ノック 2015の第7章・問題67を解きます。

■ 問題
67. 複数のドキュメントの取得
特定の(指定した)別名を持つアーティストを検索せよ.

■ Pythonのコード

import json
import pymongo
from bson.objectid import ObjectId

def ObjectIdToStr(o):
    if isinstance(o, ObjectId):
        return str(o)
    raise TypeError(repr(o) + " is not sported")

def findAlias(alias):
    client = pymongo.MongoClient('localhost', 27017)
    db = client['MusicBrainzDb']
    co = db['artists']
    return co.find({'aliases.name': alias})

def printArtist(artist):
    print('')
    print(json.dumps(artist, indent=4, ensure_ascii=False, sort_keys=True, default=ObjectIdToStr))

def main():
    alias = input('=>')
    for d in findAlias(alias):
        printArtist(d)

if __name__ == '__main__':
    main()

■ ちょと説明

ireturn co.find({'aliases.name': alias})
で検索結果を返しています。このメソッドは、条件に合うデータが複数あれば、複数のアーティストのオブジェクトが返ります。 

これをprintArtist関数で表示しています。MongoDBから取得したデータはjsonなので、json.dumpsで整形させて表示させています。


■ 実行結果

実行例では、取得したデータは一つだけですが、入力した別名と一致するアーティストが複数いれば、複数のアーティストのデータが表示されます。
=>サザン

{
    "_id": "5a653c60323575566c9d9167",
    "aliases": [
        {
            "name": "Southern All Stars",
            "sort_name": "Southern All Stars"
        },
        {
            "name": "SAS .",
            "sort_name": "SAS ."
        },
        {
            "name": "サザン",
            "sort_name": "サザン"
        }
    ],
    "area": "Japan",
    "begin": {
        "year": 1975
    },
    "ended": true,
    "gid": "24d9e513-c215-4901-87ee-b66aa769ab9d",
    "id": 9549,
    "name": "サザンオールスターズ",
    "rating": {
        "count": 2,
        "value": 70
    },
    "sort_name": "Southern All Stars",
    "tags": [
        {
            "count": 1,
            "value": "japanese"
        },
        {
            "count": 1,
            "value": "asian"
        },
        {
            "count": 1,
            "value": "fixme label mess"
        }
    ],
    "type": "Group"
}