MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Phát triển cơ sở dữ liệu Python và MongoDB

Như đã đề cập trong phần đầu của loạt bài này:Lập trình cơ sở dữ liệu Python với MongoDB, mô-đun Python PyMongo là bắt buộc để Python có thể giao tiếp với cơ sở dữ liệu MongoDB. Để cài đặt cái này, hãy sử dụng lệnh trong Windows Command Prompt:

pip3 install pymongo

Việc cài đặt PyMongo sẽ tạo ra một đầu ra tương tự như những gì được hiển thị bên dưới:

Hình 1 - Cài đặt Mô-đun PyMongo

Tùy thuộc vào cấu hình Python, một mô-đun bổ sung có tên dnspython cũng có thể cần thiết:

pip3 install dnspython

Hình 2 - Cài đặt dnspython mô-đun

Cách Chèn Dữ liệu trong MongoDB bằng Python

Đoạn mã dưới đây sẽ tạo ra 15 Nghệ sĩ được tạo ngẫu nhiên và hai Anbom cho mỗi người trong số họ:

# bad-band-name-maker-nosql.py

import sys
import random
import pymongo

part1 = ["The", "Uncooked", "Appealing", "Larger than Life", "Drooping", "Unwell", "Atrocious", "Glossy", "Barrage", "Unlawful"]
part2 = ["Defeated", "Hi-Fi", "Extraterrestrial", "Adumbration", "Limpid", "Looptid", "Cromulent", "Unsettled", "Soot", "Twinkle"]
part3 = ["Brain", "Segment", "\"Audio\"", "Legitimate Business", "\"Bob\"", "Sound", "Canticle", "Monsoon", "Preserves", "\"Cacophony\""]

part4 = ["Cougar", "Lion", "Lynx", "Ocelot", "Puma", "Jaguar", "Panther"]
part5 = ["Fodder", "Ersatz Goods", "Leftovers", "Infant Formula", "Mush", "Smoothie", "Milkshakes"]


def main(argv):
  # Connect to the RazorDemo database.
  client = pymongo.MongoClient("mongodb+srv://yourUser:[email protected]/RazorDemo?retryWrites=true&w=majority", 
    serverSelectionTimeoutMS=5000)
  artistsCollection = client["RazorDemo"]["Artists"]
  albumsCollection = client["RazorDemo"]["Albums"]

  # Generate 15 bad band names, and try to keep them unique.
  previousNames = ""
  nameCount = 0
  artistJson = []
  while (nameCount < 16):
    rand1 = random.randrange(0, 9)
    rand2 = random.randrange(0, 9)
    rand3 = random.randrange(0, 9)
    badName = part1[rand1] + ' ' + part2[rand2] + ' ' + part3[rand3]
    
    # Unlike with SQL-oriented databases, MongoDB allows for the insertion of multiple documents in a single statement.
    # In this case, the code will build a JSON list of all the band names to be inserted in a one fell swoop.
    if ("|" + previousNames + "|").find("|" + badName + "|") == -1: 
      #print ("Band name [" + str(nameCount) + "] is [" + badName + "]")
      # Don't forget to escape quotation marks!
      
      jsonEntry = { "artist_name" : badName }
      artistJson.append(jsonEntry)
      
      # Because there are no foreign key rules, the album names can be created 
      # and committed to the database before the artist names have been created.
      albumJson = []
      for y in range(1, 3):
        rand4 = random.randrange(0, len(part4))
        rand5 = random.randrange(0, len(part5))
        
        # No checks for uniqueness here. Peter Gabriel had 4 self-titled
        # albums after all.
        albumName = part4[rand4] + " " + part5[rand5]
        albumEntry = { "artist_name" : badName, "album_name" : albumName }
        albumJson.append(albumEntry)
      print (albumJson)
      albumsCollection.insert_many(albumJson)
      
      # Creates a bar-delimited list of previously used names.
      # MongoDB expects the application to enforce data integrity rules.
      if previousNames == "":
        previousNames = badName
      else:
        previousNames = previousNames + "|" + badName
      nameCount = 1 + nameCount
    else:
      print ("Found a duplicate of [" + badName + "]")

  print (artistJson)
  artistsCollection.insert_many(artistJson)

  # Close the Connection
  client.close()
  return 0

if __name__ == "__main__":
	main(sys.argv[1:])

Listing 6 - Creating Random Data

Một quan sát thú vị về mã này, ít nhất là so với các ví dụ hướng SQL trong Lập trình cơ sở dữ liệu Python với SQL Express cho người mới bắt đầu là nó đơn giản hơn nhiều, vì không có thêm thành phần SQL nào. Các hàm JSON đã là một phần của Python và lệnh duy nhất liên quan đến MongoDB là insert_many () các hàm được thực thi sau mỗi tập dữ liệu được tạo. Tiện lợi hơn nữa, các lệnh này khớp với cùng một cú pháp trong Python được sử dụng trong MongoDB Shell.

Từ quan điểm bảo mật, các vấn đề như SQL Injection chỉ đơn giản là không tồn tại trong mã như vậy, không chỉ vì không có SQL nào được thực thi, mà hoàn toàn không có bất kỳ mã nào được chuyển vào cơ sở dữ liệu. Chức năng Danh sách Python cũng xử lý các vấn đề như thoát dấu ngoặc kép.

Thay vì hiển thị đầu ra trong cửa sổ Command Prompt, một đoạn mã khác sẽ được sử dụng để truy vấn cơ sở dữ liệu thay thế.

Xác thực các Phụ trang bằng Python

Đoạn mã dưới đây sẽ truy vấn cơ sở dữ liệu MongoDB cho các hành động chèn được thực hiện ở trên bằng Python:

# bad-band-name-display-nosql.py

import sys
import pymongo

def main(argv):
  # Connect to the RazorDemo database.
  client = pymongo.MongoClient("mongodb+srv://yourUser:[email protected]/RazorDemo?retryWrites=true&w=majority", 
    serverSelectionTimeoutMS=5000)
  artistsCollection = client["RazorDemo"]["Artists"]
  albumsCollection = client["RazorDemo"]["Albums"]

  print ("Albums:")
  artists = artistsCollection.find()
  
  for artist in artists:
    print (str(artist["artist_name"]))
    albumQuery = { "artist_name": {"$eq" : str(artist["artist_name"])} }
    albumsForThisArtist = albumsCollection.find(albumQuery)
    for album in albumsForThisArtist:
      print ("\t" + str(album["album_name"]))

  # Close the Connection
  client.close()
  return 0

if __name__ == "__main__":
	main(sys.argv[1:])

Listing 7 - Validating the Insert Actions

Đầu ra bên dưới chứa các tài liệu ban đầu được tạo thêm trong tài liệu:

Hình 3 - Xác thực Phụ trang

Truy vấn dữ liệu MongoDB bằng Python

Đoạn mã trên có thể được điều chỉnh thành một công cụ tương tác để truy vấn dữ liệu với đầu vào của người dùng. MongoDB cung cấp một công cụ tìm kiếm văn bản mạnh mẽ cho các bộ sưu tập của nó, nhưng để kích hoạt nó, các chỉ mục văn bản phải được tạo trên các bộ sưu tập được tìm kiếm:

db.Artists.createIndex({artist_name: "text"})

db.Albums.createIndex({artist_name: "text", album_name: "text"})

Listing 8 - Creating Text Indices for each collection

Lưu ý rằng MongoDB chỉ cho phép một chỉ mục văn bản cho mỗi bộ sưu tập. Cố gắng tạo chỉ mục khác cho một nút khác trong tập hợp sẽ gây ra lỗi. Đầu ra của các lệnh này trong MongoDB Shell như sau:

Hình 4 - Thêm Chỉ số Văn bản

Mặc dù công cụ tìm kiếm văn bản có thể thực hiện tất cả các loại logic đối sánh điên rồ liên quan đến biểu thức chính quy và đối sánh từng phần với xếp hạng độ gần gũi, ví dụ dưới đây sẽ phù hợp với đối sánh đơn giản, để minh họa bằng chứng về khái niệm:

# bad-band-name-query-nosql.py

import sys
import pymongo

def main(argv):
  searchValue = input("Enter something: ")
  # Cap the length at something reasonable. The first 20 characters.
  searchValue = searchValue[0:20]
  # Set the search value to lower case so we can perform case-insensitive matching:
  searchValue = searchValue.lower()

  # Connect to the RazorDemo database.
  client = pymongo.MongoClient("mongodb+srv://yourUser:[email protected]/RazorDemo?retryWrites=true&w=majority", 
    serverSelectionTimeoutMS=5000)
  artistsCollection = client["RazorDemo"]["Artists"]
  albumsCollection = client["RazorDemo"]["Albums"]

  matchedArtists = "";
  artists = artistsCollection.find( { "$text":{ "$search": searchValue} })

  for artist in artists:
    matchedArtists = matchedArtists + "\t" + str(artist["artist_name"]) + "\r\n"
  if "" == matchedArtists:
    print ("No matched artists.")
  else:
    print ("Matched Artists:")
    print (matchedArtists)

  
  albums = albumsCollection.find( { "$text":{ "$search": searchValue} })
  matchedAlbums = ""
  for album in albums:
    matchedAlbums = matchedAlbums + "\t" + str(album["artist_name"]) + " - " + str(album["album_name"]) + "\r\n"
    
  if "" == matchedAlbums:
    print ("No matched albums.")
  else:
    print ("Matched Albums:")
    print (matchedAlbums)
    
  # Close the Connection
  client.close()
  return 0

if __name__ == "__main__":
	main(sys.argv[1:])


Listing 9 - Querying the data

Lưu ý rằng không cần chuyển đổi dữ liệu từ MongoDB để khớp nó với phiên bản chữ thường của cụm từ tìm kiếm.

Kết luận về phát triển Python và MongoDB

Đối với các nhà phát triển đã và đang viết mã dựa trên các máy chủ và cơ sở dữ liệu hướng SQL, bước nhảy sang noSQL có thể cảm thấy giống như mở rộng một đường cong học tập rất dốc, nhưng bằng cách ánh xạ các khái niệm cơ sở dữ liệu SQL quen thuộc với các đối tác NoSQL của họ, nó sẽ trở nên bớt khó chịu hơn một chút . Các nhà phát triển như vậy thậm chí có thể bị sốc khi thiếu các “tính năng” “cơ bản” như thực thi khóa ngoại hoặc kỳ vọng rằng đó là ứng dụng chứ không phải cơ sở dữ liệu được mong đợi thực thi các quy tắc toàn vẹn dữ liệu. Đối với các nhà phát triển cơ sở dữ liệu hướng SQL dày dặn kinh nghiệm, ngay cả việc chỉ nghĩ đến những ý tưởng như vậy cũng gần giống như lập trình dị giáo!

Nhưng cơ sở dữ liệu NoSQL như MongoDB bổ sung thêm nhiều tính năng khác khiến cho sự thay đổi trong suy nghĩ trở nên đáng giá. Không cần phải lo lắng về một phiên bản SQL khác “vừa đủ khác” để gây khó chịu hoặc không cần phải suy nghĩ về các vấn đề như SQL injection, có thể chèn nhiều bản ghi, lỗi, tài liệu dữ liệu một cách an toàn mà không gặp rắc rối “ hàng nghìn ”tuyên bố riêng lẻ và thậm chí có thể thú vị ý tưởng "điên rồ" rằng việc để ứng dụng thực hiện việc thực thi dữ liệu sẽ loại bỏ một lượng lớn nỗ lực phát triển ứng dụng khiến tất cả đều đáng được xem xét.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để thay đổi thứ tự của mảng với MongoDB?

  2. Node.js + MongoDB:chèn một và trả về tài liệu mới được chèn

  3. mongoose:tìm dữ liệu bằng cách lặp lại trên một mảng mô hình

  4. Làm cách nào để Benchmark MongoDB với YCSB?

  5. MongoDB nhóm lồng nhau?