[Python3 / MongoDB] Récapitulez légèrement les appels de traitement pymongo

Aperçu

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

Tutoriel officiel

https://api.mongodb.com/python/current/tutorial.html Même si vous ne regardez pas mon article, c'est ... en anglais

Importation de module

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.

Création d'instance

#Je vais utiliser ceci à partir de maintenant
>>> m_client = MongoClient()

Je vais lister les méthodes qui peuvent être utilisées

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']

1. Traitement de base minimal

Énumérer les noms de base de données

>>> 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']

Créer une base de données

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 ...?

Créer une collection

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)

Insérer un enregistrement

ʻ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'}.

Sélectionnez *

>>> 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.

Sélectionnez (une seule sélection)

>>> m_client.db_name.collection_name.find_one()
{'_id': ObjectId('5dec7ab6f8f8434dbcab979a'), 'hoge': 'Hoge 1'}

Sélectionnez en spécifiant les conditions (sélectionnez * où ~)

>>> 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'}

Effacer

#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>

2. Essayez plus fort

Énumérer DB?

#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 ... (´ ・ ω ・ `)

Insérer en spécifiant'_id '

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'}
]

Insérer plusieurs enregistrements (bulk_insert)

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'}
])

Suppression de collection / DB

#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']

Trier les résultats de la sélection (order_by)

#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)]))

Sélectionnez en spécifiant la plage pour une colonne spécifique

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

De plus, sélectionnez une combinaison de spécifications de condition

C'est détaillé! Diverses conditions de recherche utilisant pymongo (AND / OR / correspondance partielle / recherche par plage)

(Par conséquent omis ...)

Recommended Posts

[Python3 / MongoDB] Récapitulez légèrement les appels de traitement pymongo
Principes de base de Pandas pour les débutants ⑧ Traitement des chiffres
Principes de base pour toucher MongoDB avec MongoEngine
Bases du traitement d'images binarisées par Python
[Python3 / MongoDB] Récapitulez légèrement les appels de traitement pymongo
traitement d'image python
Traitement de fichiers Python
Synthétiser l'importation Python
accès mongodb avec pymongo
Traitement distribué Python Spartan
Traitement de fichiers en Python
Python: traitement du langage naturel
Traitement de la communication par Python
Traitement multithread en python
Premier traitement d'image Python
Traitement des requêtes en Python
Traitement d'image avec Python
Illustration de traitement de chaîne Python
Divers traitements de Python