日時を使った検索がうまくいかない
MongoDBで検索するときの条件として日時を使ってみたのだが、意図した結果が得られない。
前回(http://d.hatena.ne.jp/stog/20100525/1274890034)作ったデータベースに対して以下のように検索してみる。
mongodb_find_date.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import pymongo import datetime conn = pymongo.Connection() db = conn["mytest"] coll = db["members"] # 誕生日が2000-01-01以降のものを検索したい print "find({'birthday': {'$gte': datetime.datetime(2000, 1, 1)}})" print "----------------------------------------" for data in coll.find({'birthday': {'$gte': datetime.datetime(2000, 1, 1)}}): print "name: %(name)s,\ttype: %(type)s,\tsex: %(sex)s,\tbirthday: %(birthday)s" % data print # 誕生日でソートしたい print "find().sort('birthday')" print "----------------------------------------" for data in coll.find().sort('birthday'): print "name: %(name)s,\ttype: %(type)s,\tsex: %(sex)s,\tbirthday: %(birthday)s" % data print conn.disconnect()
以下が実行結果。意図した結果が得られていない。
1970-01-01よりも前の日付の比較がおかしい気がする。
$ python mongodb_find_date.py find({'birthday': {'$gte': datetime.datetime(2000, 1, 1)}}) ---------------------------------------- name: たなか, type: human, sex: M, birthday: 2003-01-15 00:00:00 name: さとう, type: human, sex: F, birthday: 1960-10-05 00:00:00 name: ポチ, type: dog, sex: F, birthday: 2005-06-07 00:00:00 name: タマ, type: cat, sex: F, birthday: 2008-12-24 00:00:00 name: Michael, type: human, sex: M, birthday: 1940-08-09 00:00:00 name: David, type: human, sex: M, birthday: 2009-12-05 00:00:00 name: James, type: human, sex: M, birthday: 1969-12-31 00:00:00 name: Barbara, type: human, sex: F, birthday: 1955-10-15 00:00:00 name: Anne, type: human, sex: F, birthday: 2001-01-20 00:00:00 name: Maria, type: human, sex: F, birthday: 1945-09-25 00:00:00 find().sort('birthday') ---------------------------------------- name: John, type: human, sex: M, birthday: 1970-01-01 00:00:00 name: たかはし, type: human, sex: F, birthday: 1974-02-20 00:00:00 name: Susan, type: human, sex: F, birthday: 1977-11-30 00:00:00 name: おがわ, type: human, sex: M, birthday: 1980-11-03 00:00:00 name: Mary, type: human, sex: F, birthday: 1985-04-10 00:00:00 name: タロ, type: dog, sex: M, birthday: 1995-08-08 00:00:00 name: ミケ, type: cat, sex: M, birthday: 1998-12-25 00:00:00 name: Robert, type: human, sex: M, birthday: 1999-05-20 00:00:00 name: Anne, type: human, sex: F, birthday: 2001-01-20 00:00:00 name: たなか, type: human, sex: M, birthday: 2003-01-15 00:00:00 name: ポチ, type: dog, sex: F, birthday: 2005-06-07 00:00:00 name: タマ, type: cat, sex: F, birthday: 2008-12-24 00:00:00 name: David, type: human, sex: M, birthday: 2009-12-05 00:00:00 name: Michael, type: human, sex: M, birthday: 1940-08-09 00:00:00 name: Maria, type: human, sex: F, birthday: 1945-09-25 00:00:00 name: Barbara, type: human, sex: F, birthday: 1955-10-15 00:00:00 name: さとう, type: human, sex: F, birthday: 1960-10-05 00:00:00 name: James, type: human, sex: M, birthday: 1969-12-31 00:00:00
mongo対話シェルでも試したが同じく意図した結果にならない。
$ mongo mytest MongoDB shell version: 1.4.2 url: mytest connecting to: mytest type "help" for help > var d = new Date(2000, 0, 1) > print(d) Sat Jan 01 2000 00:00:00 GMT+0900 (JST) > > > db.members.find({birthday:{$gte:d}}) { "_id" : ObjectId("4bfd44d0b4742d50ec000002"), "birthday" : "Wed Jan 15 2003 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "たなか", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec000003"), "birthday" : "Tue Jan -2147483647 584556011 23:25:52 GMT+0900 (JST)", "type" : "human", "name" : "さとう", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000004"), "birthday" : "Tue Jun 07 2005 09:00:00 GMT+0900 (JST)", "type" : "dog", "name" : "ポチ", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000006"), "birthday" : "Wed Dec 24 2008 09:00:00 GMT+0900 (JST)", "type" : "cat", "name" : "タマ", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000009"), "birthday" : "Tue Jan -2147483647 584555990 23:25:48 GMT+0900 (JST)", "type" : "human", "name" : "Michael", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec00000b"), "birthday" : "Sat Dec 05 2009 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "David", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec00000c"), "birthday" : "Tue Jan -2147483647 584556020 23:25:48 GMT+0900 (JST)", "type" : "human", "name" : "James", "sex" : "M" } { "_id" : ObjectId("4bfd44d1b4742d50ec00000e"), "birthday" : "Tue Jan -2147483647 584556006 23:25:52 GMT+0900 (JST)", "type" : "human", "name" : "Barbara", "sex" : "F" } { "_id" : ObjectId("4bfd44d1b4742d50ec00000f"), "birthday" : "Sat Jan 20 2001 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "Anne", "sex" : "F" } { "_id" : ObjectId("4bfd44d1b4742d50ec000010"), "birthday" : "Tue Jan -2147483647 584555995 23:25:52 GMT+0900 (JST)", "type" : "human", "name" : "Maria", "sex" : "F" } > > > db.members.find().sort({birthday:1}) { "_id" : ObjectId("4bfd44d0b4742d50ec000008"), "birthday" : "Thu Jan 01 1970 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "John", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec000001"), "birthday" : "Wed Feb 20 1974 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "たかはし", "sex" : "F" } { "_id" : ObjectId("4bfd44d1b4742d50ec000011"), "birthday" : "Wed Nov 30 1977 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "Susan", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000000"), "birthday" : "Mon Nov 03 1980 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "おがわ", "sex" : "M" } { "_id" : ObjectId("4bfd44d1b4742d50ec00000d"), "birthday" : "Wed Apr 10 1985 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "Mary", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000005"), "birthday" : "Tue Aug 08 1995 09:00:00 GMT+0900 (JST)", "type" : "dog", "name" : "タロ", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec000007"), "birthday" : "Fri Dec 25 1998 09:00:00 GMT+0900 (JST)", "type" : "cat", "name" : "ミケ", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec00000a"), "birthday" : "Thu May 20 1999 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "Robert", "sex" : "M" } { "_id" : ObjectId("4bfd44d1b4742d50ec00000f"), "birthday" : "Sat Jan 20 2001 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "Anne", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000002"), "birthday" : "Wed Jan 15 2003 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "たなか", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec000004"), "birthday" : "Tue Jun 07 2005 09:00:00 GMT+0900 (JST)", "type" : "dog", "name" : "ポチ", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000006"), "birthday" : "Wed Dec 24 2008 09:00:00 GMT+0900 (JST)", "type" : "cat", "name" : "タマ", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec00000b"), "birthday" : "Sat Dec 05 2009 09:00:00 GMT+0900 (JST)", "type" : "human", "name" : "David", "sex" : "M" } { "_id" : ObjectId("4bfd44d0b4742d50ec000009"), "birthday" : "Tue Jan -2147483647 584555990 23:25:48 GMT+0900 (JST)", "type" : "human", "name" : "Michael", "sex" : "M" } { "_id" : ObjectId("4bfd44d1b4742d50ec000010"), "birthday" : "Tue Jan -2147483647 584555995 23:25:52 GMT+0900 (JST)", "type" : "human", "name" : "Maria", "sex" : "F" } { "_id" : ObjectId("4bfd44d1b4742d50ec00000e"), "birthday" : "Tue Jan -2147483647 584556006 23:25:52 GMT+0900 (JST)", "type" : "human", "name" : "Barbara", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec000003"), "birthday" : "Tue Jan -2147483647 584556011 23:25:52 GMT+0900 (JST)", "type" : "human", "name" : "さとう", "sex" : "F" } { "_id" : ObjectId("4bfd44d0b4742d50ec00000c"), "birthday" : "Tue Jan -2147483647 584556020 23:25:48 GMT+0900 (JST)", "type" : "human", "name" : "James", "sex" : "M" } >
うーむ。。
自分がinsertやfindの方法を何か間違えているのか、それとも現状のMongoDBでは1970-01-01より古い日付の取扱いに難があるのか分からない。