MongoDB
 sql >> डेटाबेस >  >> NoSQL >> MongoDB

पायथन और मोंगोडीबी डेटाबेस विकास

जैसा कि इस श्रृंखला के पहले भाग में बताया गया है:MongoDB के साथ Python डेटाबेस प्रोग्रामिंग, Python मॉड्यूल PyMongo एक MongoDB डेटाबेस के साथ संवाद करने में सक्षम होने के लिए पायथन की आवश्यकता होती है। इसे स्थापित करने के लिए, विंडोज कमांड प्रॉम्प्ट पर कमांड का उपयोग करें:

pip3 install pymongo

PyMongo को स्थापित करने से नीचे दिखाए गए आउटपुट के समान उत्पादन होना चाहिए:

चित्र 1 - पायमोंगो मॉड्यूल स्थापित करना

पायथन कॉन्फ़िगरेशन के आधार पर, dnspython . नामक एक अतिरिक्त मॉड्यूल आवश्यक भी हो सकता है:

pip3 install dnspython

चित्र 2 - dnspython . को स्थापित करना मॉड्यूल

पायथन के साथ MongoDB में डेटा कैसे डालें

नीचे दिया गया कोड बेतरतीब ढंग से बनाए गए 15 कलाकार बनाएगा और दो एल्बम उनमें से प्रत्येक के लिए:

# 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

इस कोड के बारे में एक दिलचस्प अवलोकन, कम से कम शुरुआती के लिए SQL एक्सप्रेस के साथ पायथन डेटाबेस प्रोग्रामिंग में SQL-उन्मुख उदाहरणों की तुलना में यह है कि यह बहुत सरल है, क्योंकि कोई अतिरिक्त SQL घटक नहीं है। JSON फ़ंक्शन पहले से ही पायथन का एक हिस्सा हैं और केवल MongoDB से संबंधित कमांड insert_many() है। प्रत्येक डेटासेट बनने के बाद निष्पादित किए जाने वाले कार्य। इससे भी अधिक सुविधाजनक, ये कमांड पायथन में उसी सिंटैक्स से मेल खाते हैं जो MongoDB शेल में उपयोग किया जाता है।

सुरक्षा के दृष्टिकोण से, SQL इंजेक्शन जैसे मुद्दे ऐसे कोड में मौजूद नहीं होते हैं, न केवल इसलिए कि कोई SQL निष्पादित नहीं किया जा रहा है, बल्कि डेटाबेस में कोई भी कोड पारित नहीं किया जा रहा है। पायथन सूची कार्यक्षमता उद्धरण चिह्नों से बचने जैसी समस्याओं का भी ध्यान रखती है।

कमांड प्रॉम्प्ट विंडो में आउटपुट दिखाने के बजाय, डेटाबेस को क्वेरी करने के लिए एक और कोड का उपयोग किया जाएगा।

पायथन के साथ सम्मिलन को मान्य करना

नीचे दिया गया कोड पायथन का उपयोग करके ऊपर की गई सम्मिलित क्रियाओं के लिए MongoDB डेटाबेस को क्वेरी करेगा:

# 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

नीचे दिए गए आउटपुट में दस्तावेज़ में आगे बनाए गए प्रारंभिक दस्तावेज़ शामिल हैं:

चित्र 3 - निवेशनों को मान्य करना

पायथन के साथ MongoDB डेटा क्वेरी करना

उपयोगकर्ता इनपुट के साथ डेटा को क्वेरी करने के लिए उपरोक्त कोड को एक इंटरैक्टिव टूल में रूपांतरित किया जा सकता है। MongoDB अपने संग्रह के लिए एक शक्तिशाली पाठ खोज उपकरण प्रदान करता है, लेकिन इसे सक्षम करने के लिए, खोजे जाने वाले संग्रहों पर पाठ अनुक्रमणिकाएँ बनाई जानी चाहिए:

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

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

Listing 8 - Creating Text Indices for each collection

ध्यान दें कि MongoDB प्रति संग्रह केवल एक टेक्स्ट इंडेक्स की अनुमति देता है। किसी संग्रह में किसी भिन्न नोड के लिए कोई अन्य अनुक्रमणिका बनाने का प्रयास करने से त्रुटि उत्पन्न होगी। MongoDB शेल में इन कमांड का आउटपुट नीचे है:

चित्र 4 - टेक्स्ट इंडेक्स जोड़ना

जबकि टेक्स्ट सर्च टूल सभी प्रकार के क्रेजी मैचिंग लॉजिक को निष्पादित कर सकता है जिसमें रेगुलर एक्सप्रेशन और क्लोजनेस रैंकिंग के साथ आंशिक मिलान शामिल हैं, अवधारणा के प्रमाण को स्पष्ट करने के लिए नीचे दिया गया उदाहरण सरल मिलान के साथ रहेगा:

# 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

ध्यान दें कि MongoDB से आने वाले डेटा को खोज शब्द के लोअरकेस संस्करण से मिलान करने के लिए किसी रूपांतरण की आवश्यकता नहीं थी।

पायथन और MongoDB विकास पर अंतिम विचार

डेवलपर्स के लिए जो SQL-उन्मुख डेटाबेस सर्वर और डेटाबेस के खिलाफ कोडिंग कर रहे हैं, noSQL के लिए छलांग एक बहुत ही कठिन सीखने की अवस्था को स्केल करने जैसा महसूस कर सकती है, लेकिन परिचित SQL डेटाबेस अवधारणाओं को उनके NoSQL समकक्षों के लिए मैप करके, यह चढ़ाई के लिए थोड़ा कम असहज हो जाता है। . ऐसे डेवलपर्स "बुनियादी" "सुविधाओं" की कमी पर भी चौंक सकते हैं जैसे कि विदेशी कुंजी प्रवर्तन या उम्मीद है कि यह एप्लिकेशन है न कि डेटाबेस जो डेटा अखंडता नियमों को लागू करने की उम्मीद है। बहुत अनुभवी SQL-ओरिएंटेड डेटाबेस डेवलपर्स के लिए, इस तरह के विचारों के बारे में सोचा जाना भी लगभग प्रोग्रामिंग विधर्मी जैसा लगता है!

लेकिन मोंगोडीबी जैसे नोएसक्यूएल डेटाबेस कई अन्य सुविधाएं जोड़ते हैं जो इसके लायक सोच में बदलाव करते हैं। एसक्यूएल के एक और संस्करण के बारे में चिंता करने की ज़रूरत नहीं है जो परेशान होने के लिए "बस काफी अलग" है, या एसक्यूएल इंजेक्शन जैसे मुद्दों के बारे में सोचने की ज़रूरत नहीं है, कई रिकॉर्ड, गलती, डेटा के दस्तावेज़ों को सुरक्षित रूप से बिना परेशानी के सुरक्षित रूप से सम्मिलित करने में सक्षम है। हजारों” व्यक्तिगत बयान, और शायद मनोरंजक . भी "पागल" विचार यह है कि एप्लिकेशन को डेटा प्रवर्तन करने से एप्लिकेशन विकास प्रयासों का एक बड़ा हिस्सा बंद हो जाता है, यह सब विचार के लायक है।


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB वस्तुओं की एक सरणी के अंदर डेटा में शामिल होता है

  2. नेवला का उपयोग करके सूचकांक कैसे छोड़ें

  3. MongoDB दस्तावेज़ में एकाधिक फ़ील्ड अपडेट करें

  4. गोलंग + मोंगोडीबी एम्बेडेड प्रकार (किसी अन्य संरचना में एक संरचना एम्बेड करना)

  5. MongoDB:100 के संग्रह में 10 यादृच्छिक दस्तावेज़ कैसे खोजें?