studylog/北の雲

chainer/python/nlp

mongoengineあれこれ

怒濤の連投。
使ってる人がいないのかほとんど日本語の情報が出てこないので小ネタでもいいから書いていく。

クエリについて

#新宿が含まれてるの
User.objects(address__contains="新宿")

#新宿と渋谷がどちらも含まれてるもの・・・といきたいところだとこれはダメ。エラーになる。
User.objects(address__contains="新宿" , address__contains="渋谷")

#こうやって書かないといけない Qオブジェクトを使って繋げていく ここめんどくさい
User.objects((Q(address__contains="新宿") & Q(address__contains="渋谷")) )

ちなみに最後のでduplicateなんとかエラーが出た人はmongoengineのバージョンが0.8.1以前なのでもっと新しいのに上げてください。現在0.9です。

最新版をpipで入れるとハマる

mongoengineが内部で使ってるpymongoの最新版が勝手にインストールorアップデートされちゃうんですが、現在のところmongoengine0.9がpymongo3系に対応していないので動かないという滅茶苦茶な事になります。

なのでその場合はpymongoをuninstallして、pip install pymongo=="2.8"でバージョンを落す。
もしこれでDjangoでエラー出るようならbsonをuninstallするといけるはずです。ここのpedroさんの書込み。stackoverflow.com

MongoDB3系への対応

ちょっと前にmongoengine0.9はMongoDB3系に対応してないって書いちゃったんですが、すいません、普通に使えてます。pymongo3系への対応はまだしばらくかかりそう。

他個人的にハマったところ

  • in_bulk(object_ids)

object_idのリストを投げて一括検索
返り値は{object_id : object }のハッシュ
投げたリスト順に返らずに適当な順番になっちゃうところでハマった

  • distinct(field)

返り値が16MB制限にひっかかるので100万件のidを欲しい時になんかは使えない
limitで制限しても無視するっぽい?