Skip to content

Latest commit

 

History

History
691 lines (610 loc) · 16.4 KB

REPORT.md

File metadata and controls

691 lines (610 loc) · 16.4 KB

Task 3 - Робота з базовими функціями документо-орієнтованої БД на прикладі MongoDB

Завдання

  1. Створіть декілька товарів з різним набором властивостей
$ python -m app.import_data_to_mongo
  1. Напишіть запит, який виводіть усі товари >>>QUERY
db.getCollection('items').find({})
[
  {
    "_id": ObjectId("603b99fb9ecc2098454d4136"),
    "brand": "OnePlus",
    "os": "Android",
    "name": "Xiaomi Redmi Note 9",
    "title": "Xiaomi Redmi Note 9 4/128GB Midnight Grey",
    "category": "Phone",
    "price": 26959,
    "color": "Magenta",
    "description": "Member statement company little child special wide. Mean ask dog level national against. Go administration population her many subject.",
    "seller": "Rozetka",
    "RAM": "4Gb",
    "display_size": "640x480",
    "camera_resolution": "720*1024",
    "cell_phone_features": "Built-In GPS",
    "phone_carrier": "Sprint",
    "internal_storage_memory": "64Gb"
  },
  {
    "_id": ObjectId("603b99fb9ecc2098454d413d"),
    "category": "Computer",
    "price": 5504,
    "description": "Live compare dark especially. Miss think police perhaps five already. Great tax lawyer including. Very development degree quickly.",
    "seller": "Other",
    "brand": "Acer",
    "RAM": "1Gb",
    "model_year": "2018",
    "refresh_rate": "120Hz",
    "display_size": 25,
    "CPU": "Intel Core i9",
    "disk_size": "1Tb",
    "WLAN": "802.11g/n",
    "graphics_processor": "AMD Radeon HD",
    "video_output": "HDMI",
    "resolution": "1440x900"
  }
]
  1. Підрахуйте скільки товарів у певної категорії

>>>QUERY

db.items.aggregate(
    {$project: {category: 1, count: {$add: [1]}}},
    {
        $group: {
            _id: "$category",
            number: {$sum: "$count"}
        }
    })

>>>RESULT

[
  {
    "_id": "Smart watch",
    "number": 100.0
  },
  {
    "_id": "TV",
    "number": 100.0
  },
  {
    "_id": "Computer",
    "number": 100.0
  },
  {
    "_id": "Phone",
    "number": 100.0
  }
]
  1. Підрахуйте скільки є різних категорій товарів >>>QUERY
db.items.distinct('category').length

>>>RESULT

4
  1. Виведіть список всіх виробників товарів без повторів >>>QUERY
db.items.distinct('brand')

>>>RESULT

[
  "OnePlus",
  "Hisense",
  "Apple",
  "LG",
  "Xiaomi",
  "Acer",
  "Samsung",
  "HP",
  "Sony",
  "Nokia",
  "Huawei",
  "Meizu",
  "Lenovo"
]
  1. Напишіть запити, які вибирають товари за різними критеріям і їх сукупності:
    • a) категорія та ціна (в проміжку) - конструкція $and,
    • b) модель чи одна чи інша - конструкція $or,
    • c) виробники з переліку - конструкція $in

>>>QUERY

// a) категорія та ціна (в проміжку) - конструкція $and,
db.getCollection('items').find({'category': 'Phone', 'price': {'$gte': 1000, '$lte': 40000}})

// b) модель чи одна чи інша - конструкція $or,
db.getCollection('items').find({'$or': [{'brand': 'OnePlus'}, {'brand': 'Iphone'}]})

// c) виробники з переліку - конструкція $in
db.getCollection('items').find({'brand': {'$in': ['OnePlus', 'Nokia', 'Iphone']}})
  1. Оновить певні товари, змінивши існуючі значення і додайте нові властивості (характеристики) усім товарам за певним критерієм >>>QUERY
db.getCollection('items').update(
    {'price': {'$gte': 100000}},
    {
        '$mul': {'price': 0.05},
        '$set': {'promo': ['black friday 2020']}
    })
  1. Знайдіть товари у яких є (присутнє поле) певні властивості

>>>QUERY

db.getCollection('items').find({'promo': {'$exists': true}})

>>>RESULT

{
  "_id": ObjectId("603b99fb9ecc2098454d4151"),
  "category": "Computer",
  "price": 5549.0,
  "description": "Find prepare hair across hour notice east. Attack attack political course trip. Place politics late.",
  "seller": "Other",
  "brand": "LG",
  "RAM": "2Gb",
  "model_year": "2020",
  "refresh_rate": "120Hz",
  "display_size": 14,
  "CPU": "Intel Core i5",
  "disk_size": "1Tb",
  "WLAN": "802.11a/b/g/n",
  "graphics_processor": "Intel UHD Graphics",
  "video_output": "HDMI",
  "resolution": "1440x900",
  "promo": [
    "black friday 2020"
  ]
}
  1. Для знайдених товарів збільшіть їх вартість на певну суму

>>>QUERY

db.getCollection('items').update({'price': {'$lte': 5000}}, {'$inc': {'price': 750}})

Товари ви додаєте в замовлення - orders, яке містити вартість, ім'я замовника, і адресу доставки.

  1. Створіть кілька замовлень з різними наборами товарів, але так щоб один з товарів був у декількох замовленнях
$ python 
  1. Виведіть всі замовлення

>>>QUERY

db.getCollection('orders').find({})

>>>RESULT

{
  "_id": ObjectId("603bacce876e0d4992f86a08"),
  "order_number": 77794204,
  "total_sum": 448391,
  "payment": {
    "card_owner": "Juan Allen",
    "cardId": "KYBP21917335480832"
  },
  "order_items_id": [
    {
      "ref": "items",
      "id": ObjectId("603bab264653b65cd91673ee")
    },
    {
      "ref": "items",
      "id": ObjectId("603baca1ca03a20d727226be")
    }
  ],
  "customer": {
    "username": "qmiller",
    "name": "Juan Allen",
    "sex": "M",
    "address": "0542 Castillo Extensions\nNew Emily, IL 88972",
    "mail": "[email protected]"
  }
}
  1. Виведіть замовлення з вартістю більше певного значення

>>>QUERY

db.getCollection('orders').find({'total_sum': {'$gte': 5000}})

>>>RESULT

{
  "_id": ObjectId("603bacce876e0d4992f86a0b"),
  "order_number": 98611112,
  "total_sum": 747771,
  "payment": {
    "card_owner": "Jeffery Simmons",
    "cardId": "BANX21745003552066"
  },
  "order_items_id": [
    {
      "ref": "items",
      "id": ObjectId("603bacce876e0d4992f868f4")
    }
  ],
  "customer": {
    "username": "jeffrey81",
    "name": "Jeffery Simmons",
    "sex": "M",
    "address": "989 Jane Street\nLake Carolinehaven, NV 52980",
    "mail": "[email protected]"
  }
}
  1. Знайдіть замовлення зроблені одним замовником

>>>QUERY

db.getCollection('orders').find({'customer.username': 'jeffrey81'})

>>>RESULT

{
  "_id": ObjectId("603bacce876e0d4992f86a0b"),
  "order_number": 98611112,
  "total_sum": 747771,
  "payment": {
    "card_owner": "Jeffery Simmons",
    "cardId": "BANX21745003552066"
  },
  "order_items_id": [
    {
      "ref": "items",
      "id": ObjectId("603bacce876e0d4992f868f4")
    }
  ],
  "customer": {
    "username": "jeffrey81",
    "name": "Jeffery Simmons",
    "sex": "M",
    "address": "989 Jane Street\nLake Carolinehaven, NV 52980",
    "mail": "[email protected]"
  }
}
  1. Знайдіть всі замовлення з певним товаром (товарами) (шукати можна по ObjectId)

>>>QUERY

db.getCollection('orders').find({'order_items_id.id': ObjectId("603bacd7d8ad58ccfdb01286")})

>>>RESULT

/* 1 */
{
  "_id": ObjectId("603bacd7d8ad58ccfdb0129c"),
  "order_number": 52796393,
  "date": ISODate(
  "2019-03-20T03:25:45.000Z"
  ),
  "total_sum": 45221,
  "payment": {
    "card_owner": "Blake Acosta",
    "cardId": "SFJE00834007212519"
  },
  "order_items_id": [
    {
      "ref": "items",
      "id": ObjectId(
      "603bab179546df9191a7027a"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603baca1ca03a20d72722817"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacd7d8ad58ccfdb0117a"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bab9ff07a0d0e67e37471"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacd7d8ad58ccfdb01172"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bab9ff07a0d0e67e374db"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacce876e0d4992f868ef"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacd7d8ad58ccfdb01286"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bab9ff07a0d0e67e37525"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603baca1ca03a20d7272270a"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacce876e0d4992f869cf"
      )
    }
  ],
  "customer": {
    "username": "ulewis",
    "name": "Blake Acosta",
    "sex": "M",
    "address": "Unit 6390 Box 7097\nDPO AP 14475",
    "mail": "[email protected]"
  }
}

/* 2 */
{
  "_id": ObjectId(
  "603bacd7d8ad58ccfdb012b9"
  ),
  "order_number": 25101348,
  "date": ISODate(
  "1979-11-07T09:52:17.000Z"
  ),
  "total_sum": 280321,
  "payment": {
    "card_owner": "Crystal Diaz",
    "cardId": "PGBB86050840771722"
  },
  "order_items_id": [
    {
      "ref": "items",
      "id": ObjectId(
      "603bab9ff07a0d0e67e3749a"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacd7d8ad58ccfdb0114c"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bab9ff07a0d0e67e37431"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacd7d8ad58ccfdb01286"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bab0486b039da4ce0d7b3"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacd7d8ad58ccfdb01155"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bab264653b65cd91673b4"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603baca1ca03a20d727226ea"
      )
    },
    {
      "ref": "items",
      "id": ObjectId(
      "603bacce876e0d4992f869ba"
      )
    }
  ],
  "customer": {
    "username": "carlyburton",
    "name": "Crystal Diaz",
    "sex": "F",
    "address": "2542 King Ville Apt. 950\nSouth Jeffrey, KS 66684",
    "mail": "[email protected]"
  }
}
  1. Додайте в усі замовлення з певним товаром ще один товар і збільште існуючу вартість замовлення на деяке значення Х

>>>QUERY

db.getCollection('orders').update(
    {'order_items_id.id': ObjectId("603bacd7d8ad58ccfdb01286")},
    {
        '$inc': {'total_sum': 454},
        '$push': {
            'order_items_id': {
                "ref": "items",
                "id": ObjectId("603bab264653b65cd91673ee")
            }
        }
    })
  1. Виведіть кількість товарів в певному замовленні

>>>QUERY

db.orders.aggregate({'$match':{"order_number": 25101348} }, {$project: { count: { $size:"$order_items_id" }}})

>>>RESULT

{
    "_id" : ObjectId("603bacd7d8ad58ccfdb012b9"),
    "count" : 9
}
  1. Виведіть тільки інформацію про кастомера і номери кредитної карт, для замовлень вартість яких перевищує певну суму

>>>QUERY

db.getCollection('orders').find({'total_sum': {'$gte': 2343}}, {'customer': 1, 'payment.cardId': 1})

>>>RESULT

[{
    "_id" : ObjectId("603bacce876e0d4992f86a07"),
    "payment" : {
        "cardId" : "ORXH17855822034793"
    },
    "customer" : {
        "username" : "leon83",
        "name" : "Amy Fleming",
        "sex" : "F",
        "address" : "7021 Anthony Road Suite 210\nNew Debrastad, OR 04018",
        "mail" : "[email protected]"
    }
},
{
    "_id" : ObjectId("603bacce876e0d4992f86a08"),
    "payment" : {
        "cardId" : "KYBP21917335480832"
    },
    "customer" : {
        "username" : "qmiller",
        "name" : "Juan Allen",
        "sex" : "M",
        "address" : "0542 Castillo Extensions\nNew Emily, IL 88972",
        "mail" : "[email protected]"
    }
}]
  1. Видаліть товар з замовлень, зроблених за певний період дат

>>>QUERY

db.getCollection('orders').remove({'date':{'$gte': new ISODate("2017-04-14T23:59:59Z"), '$lte': new ISODate("2020-04-14T23:59:59Z")}})

>>>RESULT Removed 4 record(s) in 5ms

  1. Перейменуйте у всіх замовлення ім'я (прізвище) замовника

>>>QUERY

db.getCollection('orders').updateMany({}, {'$set':{'customer.name': 'Bob'}})

>>>RESULT

{
    "acknowledged" : true,
    "matchedCount" : 96.0,
    "modifiedCount" : 95.0
}
  1. (+2 бали)* Знайдіть замовлення зроблені одним замовником, і виведіть тільки інформацію про кастомера та товари у замовлені підставивши замість ObjectId("***") назви товарів та їх вартість (аналог join-а між таблицями orders та items). >>>QUERY
db.getCollection('orders').aggregate([
   {'$match': {'customer.username': 'qmiller'}},
   {
      "$lookup": {
         "from": "items",
         "localField": "order_items_id.id",
         "foreignField": "_id",
         "as": "items"
      }
   },
   {'$project': {'customer': 1, 'items': 1}}
])

>>>RESULT

{
    "_id" : ObjectId("603bacce876e0d4992f86a08"),
    "customer" : {
        "username" : "qmiller",
        "name" : "Bob",
        "sex" : "M",
        "address" : "0542 Castillo Extensions\nNew Emily, IL 88972",
        "mail" : "[email protected]"
    },
    "items" : [ 
        {
            "_id" : ObjectId("603bab264653b65cd91673ee"),
            "category" : "TV",
            "price" : 118451,
            "color" : "MediumOrchid",
            "description" : "West bag coach write success participant area visit. Continue future floor contain day record cultural. Space plan security event.",
            "seller" : "Other",
            "brand" : "Xiaomi",
            "RAM" : "4Gb",
            "os" : "IOS TV",
            "connectivity_type" : "ethernet",
            "model_year" : "2019",
            "resolution" : "8k",
            "television_features" : "smart TV",
            "refresh_rate" : "120Hz",
            "display_size" : 60
        }, 
        {
            "_id" : ObjectId("603baca1ca03a20d727226be"),
            "brand" : "Sony",
            "os" : "IOS",
            "name" : "iPhone 12",
            "title" : "New Apple iPhone 12(128GB, Graphite) [Locked] + Carrier Subscription",
            "category" : "Phone",
            "price" : 53032,
            "color" : "DarkTurquoise",
            "description" : "Walk thousand act fact total particular. Fly city middle sister. Government indicate remain newspaper.",
            "seller" : "Other",
            "RAM" : "1Gb",
            "display_size" : "720*1024",
            "camera_resolution" : "720*1024",
            "cell_phone_features" : "4k video recording",
            "phone_carrier" : "Sprint",
            "internal_storage_memory" : "8Gb"
        }
    ]
}
  1. Створіть Сapped collection яка б містила 5 останніх відгуків на наш інтернет-магазин. Структуру запису визначіть самостійно. Перевірте що при досягненні обмеження старі відгуки будуть затиратись

>>>QUERY

db.createCollection("feedbacks", { capped: true,size:50000, max:5 })

db.getCollection('feedbacks').insertOne({
    'created_at':new ISODate(),
    'user': {
        'username':'er123r1223',
        'email':'[email protected]' 
      },
      'text':'sdfjl jsdlfkj sdifjsdfkj sldfkjsdfl lksdjflkj ldsjflksdjfl'
    })