projection getting only what you need
play

Projection: Getting only what you need IN TRODUCTION TO MON GODB - PowerPoint PPT Presentation

Projection: Getting only what you need IN TRODUCTION TO MON GODB IN P YTH ON Donny Winston Instructor What is "projection"? reducing data to fewer dimensions asking certain data to "speak up"! INTRODUCTION TO MONGODB IN


  1. Projection: Getting only what you need IN TRODUCTION TO MON GODB IN P YTH ON Donny Winston Instructor

  2. What is "projection"? reducing data to fewer dimensions asking certain data to "speak up"! INTRODUCTION TO MONGODB IN PYTHON

  3. Projection in MongoDB Projection as a dictionary: # include only prizes.affiliations # exclude _id Include �elds: "field_name" : 1 docs = db.laureates.find( filter={}, "_id" is included by default projection={"prizes.affiliations": 1, "_id": 0}) type(docs) <pymongo.cursor.Cursor at 0x10d6e69e8> INTRODUCTION TO MONGODB IN PYTHON

  4. Projection in MongoDB # include only prizes.affiliations # convert to list and slice # exclude _id list(docs)[:3] docs = db.laureates.find( filter={}, [{'prizes': [{'affiliations': [{'city': 'Munich', projection={"prizes.affiliations": 1, 'country': 'Germany', "_id": 0}) 'name': 'Munich University'}]}]}, type(docs) {'prizes': [{'affiliations': [{'city': 'Leiden', 'country': 'the Netherlands', 'name': 'Leiden University'}]}]}, <pymongo.cursor.Cursor at 0x10d6e69e8> {'prizes': [{'affiliations': [{'city': 'Amsterda 'country': 'the Netherlands', 'name': 'Amsterdam University'}]}]}] INTRODUCTION TO MONGODB IN PYTHON

  5. Missing �elds Projection as a list # use "gender":"org" to select organizations # organizations have no bornCountry docs = db.laureates.find( list the �elds to include filter={"gender": "org"}, ["field_name1", "field_name2"] projection=["bornCountry", "firstname"]) list(docs) "_id" is included by default [{'_id': ObjectId('5bc56154f35b634065ba1dff'), 'firstname': 'United Nations Peacekeeping Forces'}, {'_id': ObjectId('5bc56154f35b634065ba1df3'), 'firstname': 'Amnesty International'}, ... ] INTRODUCTION TO MONGODB IN PYTHON

  6. Missing �elds - only projected �elds that exist are returned # use "gender":"org" to select organizations # organizations have no bornCountry docs = db.laureates.find( docs = db.laureates.find({}, ["favoriteIceCreamFlavor"]) filter={"gender": "org"}, list(docs) projection=["bornCountry", "firstname"]) list(docs) [{'_id': ObjectId('5bc56154f35b634065ba1dff')}, {'_id': ObjectId('5bc56154f35b634065ba1df3')}, [{'_id': ObjectId('5bc56154f35b634065ba1dff'), {'_id': ObjectId('5bc56154f35b634065ba1db1')}, 'firstname': 'United Nations Peacekeeping Forces'}, ... {'_id': ObjectId('5bc56154f35b634065ba1df3'), ] 'firstname': 'Amnesty International'}, ... ] INTRODUCTION TO MONGODB IN PYTHON

  7. Simple aggregation docs = db.laureates.find({}, ["prizes"]) n_prizes = 0 for doc in : # count the number of pizes in each doc n_prizes += len(doc["prizes"]) print(n_prizes) 941 # using comprehension sum([len(doc["prizes"]) for doc in docs]) 941 INTRODUCTION TO MONGODB IN PYTHON

  8. Let's project! IN TRODUCTION TO MON GODB IN P YTH ON

  9. Sorting IN TRODUCTION TO MON GODB IN P YTH ON Donny Winston Donny Winston

  10. Sorting post-query with Python docs = list(db.prizes.find({"category": "physics"}, ["year"])) print([doc["year"] for doc in docs][:5]) ['2018', '2017', '2016', '2015', '2014'] from operator import itemgetter docs = sorted(docs, key=itemgetter("year")) print([doc["year"] for doc in docs][:5]) ['1901', '1902', '1903', '1904', '1905'] docs = sorted(docs, key=itemgetter("year"), reverse=True) print([doc["year"] for doc in docs][:5]) ['2018', '2017', '2016', '2015', '2014'] INTRODUCTION TO MONGODB IN PYTHON

  11. Sorting in-query with MongoDB cursor = db.prizes.find({"category": "physics"}, ["year"], sort=[("year", 1)]) print([doc["year"] for doc in cursor][:5]) ['1901', '1902', '1903', '1904', '1905'] cursor = db.prizes.find({"category": "physics"}, ["year"], sort=[("year", -1)]) print([doc["year"] for doc in cursor][:5]) ['2018', '2017', '2016', '2015', '2014'] ['20 8' '20 ' '20 ' '20 ' '20 '] INTRODUCTION TO MONGODB IN PYTHON

  12. Primary and secondary sorting for doc in db.prizes.find( {"year": {"$gt": "1966", "$lt": "1970"}}, ["category", "year"], sort=[("year", 1), ("category", -1)]): print("{year} {category}".format(**doc)) 1967 physics 1967 medicine 1967 literature 1967 chemistry 1968 physics 1968 peace 1968 medicine 1968 literature 1968 chemistry 1969 physics 1969 peace 1969 medicine 1969 literature 1969 economics 1969 chemistry INTRODUCTION TO MONGODB IN PYTHON

  13. Sorting with pymongo versus MongoDB shell In MongoDB shell: Example sort argument: {"year": 1, "category": -1} JavaScript objects retain key order as entered In Python (< 3.7): {"year": 1, "category": 1} {'category': 1, 'year': 1} [("year", 1), ("category", 1)] [('year', 1), ('category', 1)] INTRODUCTION TO MONGODB IN PYTHON

  14. Let's get sorted! IN TRODUCTION TO MON GODB IN P YTH ON

  15. What are indexes? IN TRODUCTION TO MON GODB IN P YTH ON Donny Winston Instructor

  16. What are indexes? INTRODUCTION TO MONGODB IN PYTHON

  17. What are indexes? INTRODUCTION TO MONGODB IN PYTHON

  18. What are indexes? INTRODUCTION TO MONGODB IN PYTHON

  19. When to use indexes? Queries with high speci�city Large documents Large collections INTRODUCTION TO MONGODB IN PYTHON

  20. Gauging performance before indexing Jupyter Notebook %%timeit magic (same as python -m timeit "[expression]" ) %%timeit docs = list(db.prizes.find({"year": "1901"})) 524 µs ± 7.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) %%timeit docs = list(db.prizes.find({}, sort=[("year", 1)])) 5.18 ms ± 54.9 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) INTRODUCTION TO MONGODB IN PYTHON

  21. Adding a single-�eld index index model: list of (field, direction) %%timeit # Previously: 524 µs ± 7.34 µs pairs. docs = list(db.prizes.find({"year": "1901"})) directions: 1 (ascending) and -1 (descending) 379 µs ± 1.62 µs per loop db.prizes.create_index([("year", 1)]) (mean ± std. dev. of 7 runs, 1000 loops each) %%timeit 'year_1' # Previously: 5.18 ms ± 54.9 µs docs = list(db.prizes.find({}, sort=[("year", 1)])) 4.28 ms ± 95.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 4.28 ms ± 95.7 µs per loop (mean ± std. dev. of 7 runs, 1 INTRODUCTION TO MONGODB IN PYTHON

  22. Adding a compound (multiple-�eld) index index "covering" a query with projection and db.prizes.create_index([("category", 1), ("year", 1)]) sorting index "covering" a query with projection db.prizes.find_one({"category": "economics"}, {"year": 1, "_id": 0}, list(db.prizes.find({"category": "economics"}, sort=[("year", 1)]) {"year": 1, "_id": 0})) # Before # Before 673 µs ± 3.36 µs per loop 645 µs ± 3.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) (mean ± std. dev. of 7 runs, 1000 loops each) # After # After 407 µs ± 5.51 µs per loop 503 µs ± 4.37 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) (mean ± std. dev. of 7 runs, 1000 loops each) INTRODUCTION TO MONGODB IN PYTHON

  23. Learn more: ask your collection and your queries db.laureates.index_information() # always an index on "_id" field db.laureates.create_index([("firstname", 1), ("bornCountry", 1)]) db.laureates.find( {"firstname": "Marie"}, {"bornCountry": 1, "_id": 0}).explain() {'_id_': {'v': 2, 'key': [('_id', 1)], 'ns': 'nobel.laureates'}} ... db.laureates.find( 'winningPlan': {'stage': 'PROJECTION', {"firstname": "Marie"}, {"bornCountry": 1, "_id": 0}).explain() 'transformBy': {'bornCountry': 1, '_id': 0}, 'inputStage': {'stage': 'IXSCAN', 'keyPattern': {'firstname': 1, 'bornCountry': 1}, ... 'indexName': 'firstname_1_bornCountry_1', 'winningPlan': {'stage': 'PROJECTION', ... 'transformBy': {'bornCountry': 1, '_id': 0}, 'inputStage': {'stage': 'COLLSCAN', ... INTRODUCTION TO MONGODB IN PYTHON

  24. Let's practice! IN TRODUCTION TO MON GODB IN P YTH ON

  25. Limits and Skips with Sorts, Oh My! IN TRODUCTION TO MON GODB IN P YTH ON Donny Winston Instructor

  26. Limiting our exploration for doc in db.prizes.find({}, ["laureates.share"]): for doc in db.prizes.find({"laureates.share": "3"}, limit=3): share_is_three = [laureate["share"] == "3" print("{year} {category}".format(**doc)) for laureate in doc["laureates"]] assert all(share_is_three) or not any(share_is_three) 2017 chemistry 2017 medicine for doc in db.prizes.find({"laureates.share": "3"}): 2016 chemistry print("{year} {category}".format(**doc)) 2017 chemistry 2017 medicine 2016 chemistry 2015 chemistry 2014 physics 2014 chemistry 2013 chemistry ... INTRODUCTION TO MONGODB IN PYTHON

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend