Comme le dit le titre.
J'ai récemment commencé à utiliser MongoDB, mais j'avais des problèmes parce que les informations étaient dispersées sur différents sites, donc je visais à "collecter ce que j'utilise habituellement (` ・ ω ・ ´) ". C'est un article.
Versions
$ python -V
Python 3.7.1
$ pip list | grep pymongo
pymongo 3.9.0
https://api.mongodb.com/python/current/tutorial.html Même si vous ne regardez pas mon article, c'est ... en anglais
from pymongo import MongoClient, DESCENDING, ASCENDING
En supposant que l'instruction d'importation écrite ici a déjà été exécutée, j'écrirai l'article suivant.
#Je vais utiliser ceci à partir de maintenant
>>> m_client = MongoClient()
Doba
>>> dir(m_client)
['HOST', 'PORT', '_BaseObject__codec_options', '_BaseObject__read_concern', '_BaseObject__read_preference', '_BaseObject__write_concern', '_MongoClient__all_credentials', '_MongoClient__cursor_manager', '_MongoClient__default_database_name', '_MongoClient__index_cache', '_MongoClient__index_cache_lock', '_MongoClient__kill_cursors_queue', '_MongoClient__lock', '_MongoClient__options', '_MongoClient__start_session', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_cache_credentials', '_cache_index', '_cached', '_close_cursor', '_close_cursor_now', '_constructor_args', '_database_default_options', '_encrypter', '_end_sessions', '_ensure_session', '_event_listeners', '_get_server_session', '_get_socket', '_get_topology', '_is_writable', '_kill_cursors', '_kill_cursors_executor', '_process_periodic_tasks', '_process_response', '_purge_credentials', '_purge_index', '_read_preference_for', '_repr_helper', '_reset_server', '_reset_server_and_request_check', '_retry_with_session', '_retryable_read', '_retryable_write', '_return_server_session', '_run_operation_with_response', '_select_server', '_send_cluster_time', '_server_property', '_slaveok_for_server', '_socket_for_reads', '_socket_for_writes', '_tmp_session', '_topology', '_topology_settings', '_write_concern_for', 'address', 'arbiters', 'close', 'close_cursor', 'codec_options', 'database_names', 'drop_database', 'event_listeners', 'fsync', 'get_database', 'get_default_database', 'is_locked', 'is_mongos', 'is_primary', 'kill_cursors', 'list_database_names', 'list_databases', 'local_threshold_ms', 'max_bson_size', 'max_idle_time_ms', 'max_message_size', 'max_pool_size', 'max_write_batch_size', 'min_pool_size', 'next', 'nodes', 'primary', 'read_concern', 'read_preference', 'retry_reads', 'retry_writes', 'secondaries', 'server_info', 'server_selection_timeout', 'set_cursor_manager', 'start_session', 'unlock', 'watch', 'write_concern']
>>> m_client.list_database_names()
['admin', 'candles', 'config', 'local'] #DB qui était dans mon mongodb
#Le résultat est le même dans les deux cas ~
>>> m_client.database_names()
['admin', 'candles', 'config', 'local']
Quel ** inutile **! Même si le DB spécifié n'existe pas, si vous y entrez des données, le DB sera créé ensemble! C'est pratique, mais un peu effrayant ...?
C'est également ** inutile **! Dans mongodb, il existe un cadre appelé Collection dans la base de données et des enregistrements y sont insérés, mais une collection qui n'existe pas au moment de l'insertion de l'enregistrement est automatiquement créée.
- Ce qui est inséré dans MongoDB n'est pas un enregistrement mais à l'origine appelé ** document **, mais dans cet article nous utiliserons le nom d'un enregistrement qui est souvent utilisé comme unité pour l'insérer un par un.
C'est aussi pratique mais un peu effrayant. (Même si la spécification de la collection est incorrecte, aucune erreur ne peut se produire)
ʻInstance.db name.collection name.insert_one ({'hoge': 'hoge'}) ` Ce sera écrit comme ça.
>>> m_client.db_name.collection_name.insert_one({'hoge': 'Hoge 1'})
<pymongo.results.InsertOneResult object at 0x7fb567329448>
#Il existe également une méthode d'insertion, mais je me fâche quand je l'utilise
>>> m_client.db_name.collection_name.insert({'hoge': 'Hoge 2'})
__main__:1: DeprecationWarning: insert is deprecated. Use insert_one or insert_many instead.
ObjectId('5dec7ab6f8f8434dbcab979a')
Vous avez maintenant inséré deux {'hoge': 'hoge'}.
>>> m_client.db_name.collection_name.find()
<pymongo.cursor.Cursor object at 0x7fb56730ddd8> #Es-tu encore...
#Vous pouvez voir le contenu en les plaçant dans une liste et en les organisant.
>>> list(m_client.db_name.collection_name.find())
[
{'_id': ObjectId('5dec7ab6f8f8434dbcab979a'), 'hoge': 'Hoge 1'},
{'_id': ObjectId('5dec7ae3f8f8434dbcab979b'), 'hoge': 'Hoge 2'}
]
Il y a deux hoge que je viens de mettre.
>>> m_client.db_name.collection_name.find_one()
{'_id': ObjectId('5dec7ab6f8f8434dbcab979a'), 'hoge': 'Hoge 1'}
>>> list(m_client.db_name.collection_name.find({'hoge': 'Hoge 2'}))
[
{'_id': ObjectId('5dec7ab6f8f8434dbcab979a'), 'hoge': 'Hoge 2'}
]
# 'hoge'La valeur de la colonne est'Hoge 2'S'il y a d'autres données, tout sera acquis
# find_Si tel est le cas, sélectionnez-en un seul
>>> m_client.db_name.collection_name.find_one({'hoge': 'Hoge'})
{'_id': ObjectId('5dec7ae3f8f8434dbcab979b'), 'hoge': 'Hoge'}
#Le premier enregistrement trouvé par la condition est supprimé
>>> m_client.db_name.collection_name.delete_one({'hoge': 'Hoge 2'})
<pymongo.results.DeleteResult object at 0x7fb567344208>
#Je ne peux pas voir le contenu avec juste ça....
>>> m_client.list_databases()
<pymongo.command_cursor.CommandCursor object at 0x7fb56730dcf8>
#Alors pour arranger
>>> list(m_client.list_databases())
[
{'name': 'admin', 'sizeOnDisk': 102400.0, 'empty': False},
{'name': 'candles', 'sizeOnDisk': 1875968.0, 'empty': False},
{'name': 'config', 'sizeOnDisk': 98304.0, 'empty': False},
{'name': 'local', 'sizeOnDisk': 73728.0, 'empty': False}
]
Je ne sais pas quoi utiliser ... (´ ・ ω ・ `)
mongodb attribuera automatiquement un'_id 'unique à chaque enregistrement lorsque vous l'insérerez.
Mais si vous voulez spécifier vous-même l''_id ', faites-le.
>>> m_client.db_name.collection_name.insert({
'_id': 'id',
'hoge': 'Hoge 3'
})
#Alors ça devient comme ça
>>> list(m_client.your_db_name.your_collection_name.find())
[
{'_id': ObjectId('5dec7ab6f8f8434dbcab979a'), 'hoge': 'Hoge 1'},
{'_id': ObjectId('5dec7ae3f8f8434dbcab979b'), 'hoge': 'Hoge'},
{'_id': 'id', 'hoge': 'Hoge 3'}
]
#Dois-je entrer la date et l'heure? je pense
>>> import datetime
>>> m_client.db_name.collection_name.insert_one({'_id': datetime.datetime.now(), 'hoge': 'Hoge 4'})
>>> list(m_client.db_name.collection_name.find())
[
{'_id': ObjectId('5dec7ab6f8f8434dbcab979a'), 'hoge': 'Hoge 1'},
{'_id': ObjectId('5dec7ae3f8f8434dbcab979b'), 'hoge': 'Hoge'},
{'_id': 'id', 'hoge': 'Hoge 3'},
{'_id': datetime.datetime(2019, 12, 8, 14, 58, 31, 579000), 'hoge': 'Hoge 4'}
]
Passez les données au format tableau à la méthode ʻinsert_many`
#Quand je le lance, ça ressemble à ça
m_client.db_name.collection_name.insert_many([
{'hoge': 'Hexagone'},
{'hoge': 'Hexagone'}
])
#Collection supprimée
>>> m_client.db_name.collection_name.drop()
>>> list(m_client.db_name.collection_name.find())
[]
#↑ Plus de hits
#Lorsqu'il n'y a pas de collection, la base de données est automatiquement partie!
>>> list(m_client.list_database_names())
['admin', 'candles', 'config', 'local']
#Pour le moment, insérez de nombreux enregistrements(5~Courir 6 fois)
>>> m_client.db_name.collection_name.insert_one({'_id': datetime.datetime.now(), 'hoge': 'Hoge'})
#Tri décroissant(La nouvelle date et l'heure sont en haut)
>>> list(m_client.db_name.collection_name.find().sort('_id', DESCENDING))
[
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 56, 625000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 984000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 528000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 121000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 54, 696000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 9, 36, 233000), 'hoge': 'Hoge'}
]
#Tri croissant(L'ancienne date et heure est en haut)
>>> list(m_client.db_name.collection_name.find().sort('_id', ASCENDING))
[
{'_id': datetime.datetime(2019, 12, 8, 15, 9, 36, 233000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 54, 696000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 121000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 528000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 984000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 56, 625000), 'hoge': 'Hoge'}
]
#En fait, je peux toujours y aller(J'aime celui la)
>>> list(m_client.db_name.collection_name.find(sort=[('_id', DESCENDING)]))
Il s'agit de l'identifiant utilisé pour spécifier la plage
c'est tout | Super | Moins que | Moins que | |
---|---|---|---|---|
identifiant | $gte | $gt | $lte | $lt |
#Au-dessus d'une valeur spécifique (après cette date et cette heure)
>>> list(m_client.db_name.collection_name.find(filter={
'_id':{'$gte': datetime.datetime(2019, 12, 8, 15, 10, 55, 528000)}
}))
[
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 528000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 984000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 56, 625000), 'hoge': 'Hoge'}
]
#Une valeur qui dépasse une valeur spécifique (à l'exclusion de cette date et heure, après cette date et heure)
>>> list(m_client.db_name.collection_name.find(filter={
'_id':{'$gt': datetime.datetime(2019, 12, 8, 15, 10, 55, 528000)}
}))
[
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 984000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 56, 625000), 'hoge': 'Hoge 4'}
]
#D'une valeur spécifique à une valeur spécifique
>>> list(m_client.db_name.collection_name.find(filter={
'_id':{
'$gte': datetime.datetime(2019, 12, 8, 15, 10, 55, 121000),
'$lte': datetime.datetime(2019, 12, 8, 15, 10, 55, 984000)
}
}))
[
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 121000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 528000), 'hoge': 'Hoge'},
{'_id': datetime.datetime(2019, 12, 8, 15, 10, 55, 984000), 'hoge': 'Hoge'}
]
«$ gt» et «$ lt» ont la signification opposée
C'est détaillé! Diverses conditions de recherche utilisant pymongo (AND / OR / correspondance partielle / recherche par plage)
(Par conséquent omis ...)
Recommended Posts