🍞

【MongoDB】日本語でソートするためにフィールドへCollationsを設定する(mongoengine使用)

2024/12/28に公開

概要

MongoDBで日本語のデータが入るフィールドでソートをかけたい場合、Collations(照合順序)を設定する必要があります。今回はその設定をPythonのmongoengineでっ行ってみたので、そのメモ書きです。

前提

  • 使用したMongoDBのバージョンは8.0.1です。
  • 使用したmongoengineのバージョンは0.29.1です。

Collations(照合順序)について

概要についてはひとりMongoDB University / M201 MongoDB Performance(4)の記事のCollationsの項が参考になります。公式ドキュメントは照合を使用したコレクションの作成を参照ください。
では、CollationsをどうやってmongoengineのDocumentに設定するかですが、How to specify collation on Documents (Class in MongoEngine)?の記事にある通り、metaのindex配下で指定する方法が挙げられます。

実装サンプル

mongoengineのDocumentに設定する実装サンプルは以下です。

class PostPlace(Document):
    _id = fields.StringField(required=True)
    name = fields.StringField(required=True)
    create_user_account_id = fields.StringField(required=True)
    address = fields.StringField()
    lon_lat = fields.ListField(fields.FloatField())
    prefecture_code = fields.StringField()
    category_id_list = fields.ListField(fields.StringField())
    detail = fields.StringField()
    url = fields.StringField()
    meta = {
        "collection": "post_places",
        "indexes": [
            "create_user_account_id",
            "prefecture_code",
            "category_id_list",
            [("lon_lat", "2dsphere")],
            {"fields": ["name"], "collation": {"locale": "ja"}},
            {"fields": ["address"], "collation": {"locale": "ja"}},
        ],
    }

MongoDB Compassでは、以下のようにcollationが設定表示されます。

Discussion