from pymongo import MongoClient
from datetime import datetime
from datetime import timedelta
import time
import json
import pymongo
#connexion
connexion = MongoClient()
print(connexion)
#base de donnée à créer s'appelle 'bdcommerce'
bd = connexion["bdcommerce"]
#collection à créer s'appelle 'client'
client = bd["client"]
#autre collection
produit = bd["produit"]
#nouveaux documents (de nouveaux clients)
c1 = {"idcli":1,"nom":"karimi","prenom":"farid"}
c2 = {"idcli":1,"nom":"karimi","prenom":"farid","commandes":[{"idcmde":1,"datecmde": datetime(2000,5,5,10,5,6)},{"idcmde":2,"datecmde": datetime(1980,5,5,10,5,6)}],"adresse":{"pays":"maroc","ville":"rabat"}}
client.insert_one(c1)
client.insert_one(c2)
c= {"idcli":10,"nom":"karimi","prenom":"farid","heureDerniereCommande":time.time()}
client.insert_one(c)
#liste des clients
print("liste des clients :")
listeClients = client.find()
for cli in listeClients[:]:
print(cli)
#heures des dernières commandes
print("heures des dernières commandes :")
listeClients = client.find()
for cli in listeClients[:]:
if "heureDerniereCommande" in cli.keys(): #cli est un dictionnaire
print(time.ctime(cli["heureDerniereCommande"])) #ctime() : convertir heure en seconde dans une chaine locale
#ref => https://www.mongodb.com/docs/manual/reference/operator/
#ref (selection & projection) => https://www.analyticsvidhya.com/blog/2020/08/query-a-mongodb-database-using-pymongo/
#selection => ex : clients ayant le nom="karimi" et prenom="farid"
print('clients ayant le nom="karimi" et prenom="farid" :')
selection = {"nom":"karimi","prenom":"farid"}
listeClients_selection = client.find(selection)
for cli in listeClients_selection[:]:
print(cli)
#operateurs
print("selection 1 :")
selection = {"nom": { "$eq" : "sadiki"}}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
print("selection 2 :")
#$ne : not equal => famille : ($ne,$eq(equal),$gt(greater than),
# $gte(greater than equal),$lt(lesss than),$lte(less than equal))
#$nin : not in => famille : ($nin, $in(in))
#$exits : if 'true' => document contains the field (including the case where its value is null)
#$exists => famille(element operators) : ($type : format => { field: { $type: <BSON type> } },
# list of types => ref : https://www.mongodb.com/docs/manual/reference/operator/query/type/)
#$and => famille : ($and, $or, $nor, $not)
selection = {"$and":[{"nom":{"$ne":"sadiki"}},{"age":{"$exists":True, "$gte":30, "$nin":[30,33]}}]}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
selection = {"$and"["prix":{"$type":"float"},{"gte":50}]}
selection = {"$and"["cdmde":{"idcde":{"$eq":2000}} , {"datecmde":{"$in":[20,23] }}]}
print("selection 3 :")
selection = {"$or":[{"$and":[{"prix":{"$type":"int"}},{"prix":{"$gte":100}}]} , {"qtestock":{"$exists":True}}]}
liste = produit.find(selection)
# selection = {"client":{"nom":{"$exists":True}},"prenom":{"$exist":True}}
# selection = {"age":{"$gte":18}}
for prod in liste[:]:
print(prod)
print("selection 4 (regex) :")
selection = {"telephone":{"$regex":"^06(\d){8}$"}} #metacharacters => ref : https://www.w3schools.com/python/python_regex.asp
selection1 = {"telephone":{"$regex":"^07(\d){8}$"}}
liste = client.find(selection, selection1)
for cli in liste[:]:
print(cli)
#requêtes sur les tableaux et les objets
print("selection 5 : clients ayant 2 commandes :")
selection = {"commandes":{"$size":2}}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
print("selection 6 : clients ayant 'Meknes' comme une ville de livraison :")
selection = {"villeslivraison":{"$eq":"meknes"}}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
print("selection 7 : clients ayant 'meknes' et 'rabat' comme des villes de livraison :")
selection = {"villeslivraison":{"$elemMatch":{"$eq":"meknes","$eq":"rabat"}}}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
print("selection 8 : clients ayant 'meknes' ou 'rabat' comme des villes de livraison :")
selection = {"$or":[{"villeslivraison":"meknes"},{"villeslivraison":"rabat"}]}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
print("selection 9 : clients ayant 'marrakech' comme deuxième ville de livraison :")
selection = {"villeslivraison.1":{"$eq":"marrakech"}}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
print("selection 10 : clients ayant la quantité de la première commande >= 100 :")
selection = {"commandes.0.qte":{"$gte":100}}
liste = client.find(selection)
for cli in liste[:]:
print(cli)
#projection => ex : extraire l'idcli et le nom
print("extraire l'idcli et le nom (_id aussi extrait) :")
liste = client.find({},{"nom":1,"idcli":1}) #positionner les clés à extraire à 1
for cli in liste[:]:
print(cli)
print("extraire l'idcli et le nom (_id exclu):")
liste = client.find({},{"nom":1,"idcli":1, "_id":0}) #positionner les clés à extraire à 1
for cli in liste[:]:
print(cli)
print("exclure l'idcli et le nom :")
liste = client.find({},{"nom":0,"idcli":0}) #on positionne les clés à exclure à 0
for cli in liste[:]:
print(cli)
#opérations arithmétiques
col = bd["col"]
col.insert_one({"x":-80,"y":3,"dat":datetime(2000,4,7)})
print("col:")
selection = col.find({})
for doc in selection[:]:
print("x:",doc["x"],"y:",doc["y"],"dat:",doc["dat"].strftime("%d/%m/%Y"))
selection = col.aggregate(
[
{"$project":{
"x":1,
"y":1,
"somme":{"$add":["$x","$y"]},
"soustraction":{"$subtract":["$x","$y"]},
"produit":{"$multiply":["$x","$y"]},
"division":{"$divide":["$x","$y"]},
"modulo":{"$mod":["$x","$y"]},
"_id":1
}
}
]
)
for doc in selection:
print("x:",doc["x"],"y:",doc["y"],"somme:",doc["somme"],
"soustraction:",doc["soustraction"],"produit:",doc["produit"],"division:",
doc["division"],"modulo:",doc["modulo"],doc["_id"])
#condition
selection = col.aggregate(
[
{
"$project":{
"x":1,
"absX":{"$cond":{"if":{"$gte":["$x",0]},"then":"$x","else":{"$multiply":[-1,"$x"]}}},
"sommeInR":{"$cond":{"if":{"$lte":["$y",0]},"then":[{"$multiply":["$y",-1]},{"$add":["$x","$y"]}],
"else":{"$add":["$x","$y"]}}},
"_id":0
}
}
]
)
print("valeurs absolues de x:")
for X in selection:
print("x : ",X["x"],", |x| : ",X["absX"],X["sommeInR"])
#let
print("extraire l'idcli et la quantité de la première commande de chaque client:")
liste = client.aggregate(
[
{"$project": {
"_id":0,
"idcli":1,
"qtepremierecommande": {
"$let": {
"vars": {
"firstMember": {
"$arrayElemAt": [ #extraire l'élément d'indice 0 au tableau 'commandes'
"$commandes",
0
]
}
},
"in": "$$firstMember.qte" #dans ce cas '$$firstMember' représente le premier élément du tanleau 'commandes'
}
}
}
}
]
)
for cli in liste:
print(cli)
#a revoir
#valeurs commandés par un client => somme(prixu*qte)(prixu et qte concernent les produits des commandes du client en question)
# liste = client.aggregate(
# [
# {
# "$project":{
# "produitqp":{
# "$let":{
#