Trong bài viết này, chúng tôi sẽ đề cập đến cách thực hiện các thao tác truy vấn cơ bản trong MongoDB. Chúng tôi đang sản xuất dữ liệu với tốc độ vô song hiện nay sau sự lan rộng toàn cầu của Internet. Vì nó sẽ yêu cầu chúng tôi thu thập / yêu cầu dữ liệu cần thiết từ cơ sở dữ liệu để tiến hành một số loại phân tích, điều quan trọng nhất là chúng tôi chọn công cụ phù hợp để truy vấn dữ liệu.
Đặc biệt, đây là lúc MongoDB xuất hiện. MongoDB là một cơ sở dữ liệu phi cấu trúc, ở dạng tài liệu, lưu trữ dữ liệu. Ngoài ra, MongoDB rất hiệu quả trong việc xử lý một lượng lớn dữ liệu và là cơ sở dữ liệu NoSQL được sử dụng phổ biến nhất vì nó cung cấp ngôn ngữ truy vấn phong phú và khả năng truy cập dữ liệu linh hoạt và dễ dàng.
Tạo cơ sở dữ liệu mẫu
Trước khi bắt đầu, chúng tôi sẽ tạo một DB mẫu với một số dữ liệu mẫu để thực hiện tất cả các hoạt động.
Chúng tôi sẽ tạo cơ sở dữ liệu với tên myDB và sẽ tạo một bộ sưu tập có tên đơn đặt hàng . Đối với điều này, tuyên bố sẽ như sau.
> use myDB
> db.createCollection("orders")
>
MongoDB không sử dụng hàng và cột. Nó lưu trữ dữ liệu ở định dạng tài liệu. Bộ sưu tập là một nhóm tài liệu.
Bạn có thể kiểm tra tất cả các tập hợp trong cơ sở dữ liệu bằng cách sử dụng câu lệnh sau.
> use myDB
>show collections
orders
system.indexes
>
Hãy chèn một số tài liệu bằng cách sử dụng câu lệnh sau.
> db.orders.insert([
{
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 1000.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"},
PaymentMode":"Cash",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
Customer: "ron",
Address:{"City":"New York","Country":"USA"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
])
Một tài liệu tương đương với một hàng RDBMS. Nó không cần phải có cùng một lược đồ trong mỗi tài liệu. Điều đó có nghĩa là một tài liệu có thể không có bất kỳ trường nào không có bất kỳ giá trị nào.
Tài liệu Truy vấn
phương thức find ()
Bạn cần sử dụng phương thức find () để truy vấn tài liệu từ bộ sưu tập MongoDB. Câu lệnh sau sẽ truy xuất tất cả các tài liệu từ bộ sưu tập.
> db.orders.find()
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 1000.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"},
PaymentMode":"Cash",
OrderTotal: 800.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
Address:{"City":"New York","Country":"USA"},
PaymentMode":"Card",
Email:"[email protected]",
OrderTotal: 600.00,
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
>
Phép chiếu
Nếu bạn chỉ muốn tìm nạp các trường đã chọn thì bạn có thể sử dụng phép chiếu. Tuyên bố sau sẽ chỉ tìm nạp Khách hàng và Email trường.
> db.orders.find( { }, { Customer: 1, Email: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Email:"[email protected]"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
Email:"[email protected]"
}
>
Lọc Tài liệu bằng cách Chỉ định Điều kiện
Bây giờ chúng ta sẽ tìm hiểu cách chúng ta có thể tìm nạp các tài liệu phù hợp với một điều kiện cụ thể. MongoDB cung cấp nhiều toán tử so sánh cho việc này.
1. Nhà điều hành $ eq
Toán tử $ eq kiểm tra sự bình đẳng của giá trị trường với giá trị được chỉ định. Để tìm nạp đơn đặt hàng tại PaymentMode là 'Thẻ', bạn có thể sử dụng câu lệnh sau
>db.orders.find( { PaymentMode: { $eq: "Card" } } )
Truy vấn này cũng có thể được viết như bên dưới
>db.orders.find( { PaymentMode: "Card" } )
Một câu lệnh SQL tương tự sẽ như sau
SELECT * FROM orders WHERE PaymentMode="Card"
Ví dụ
>db.orders.find( { PaymentMode: "Card" }, { Customer: 1, PaymentMode: 1 } )
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
PaymentMode":"Card"
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
PaymentMode":"Card"
}
>
Nhà điều hành $ eq với tài liệu được nhúng
Bạn có thể nhận thấy rằng chúng tôi đã chèn một tài liệu nhúng Địa chỉ trong Đơn đặt hàng thu thập. Nếu bạn muốn tìm nạp đơn đặt hàng tại Quốc gia là 'Ấn Độ', bạn có thể sử dụng ký hiệu dấu chấm như câu lệnh sau.
>db.Orders.find( { "Address.Country": { $eq: "India" } } )
Truy vấn này cũng có thể được viết như bên dưới
>db.Orders.find( { "Address.Country":"India" } )
Ví dụ
>db.Orders.find( { "Address.Country": { $eq: "India" } } , { Customer: 1, Address: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
Address:{"City":"Jaipur","Country":"India"}
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
Address:{"City":"Delhi","Country":"India"}
}
>
Toán tử $ eq với mảng
Toán tử $ eq sẽ truy xuất tất cả các tài liệu nếu điều kiện được chỉ định là đúng với bất kỳ mục nào trong một mảng. Chúng tôi có một OrderItems mảng trong tài liệu. Nếu bạn muốn lọc các tài liệu trong đó 'giấy' cũng được đặt hàng thì câu lệnh sẽ như sau.
>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } )
Truy vấn này cũng có thể được viết như bên dưới
>db.Orders.find( { "OrderItems.ItemName": "paper" } )
Ví dụ
>db.Orders.find( { "OrderItems.ItemName": { $eq: "paper" } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
}
>
2. Nhà điều hành $ gt
Bạn có thể sử dụng toán tử $ gt để truy xuất các tài liệu trong đó giá trị của trường lớn hơn giá trị được chỉ định. Câu lệnh sau sẽ tìm nạp các tài liệu trong đó OrderTotal lớn hơn 800.
>db.orders.find( { OrderTotal: { $gt: 800.00 } } )
Một câu lệnh SQL tương tự sẽ như sau
SELECT * FROM orders WHERE OrderTotal>800.00
Ví dụ
>db.Orders.find( { "OrderTotal": { $gt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderTotal: 1000.00
}
>
3. Nhà điều hành $ gte
Bạn có thể sử dụng toán tử $ gte để truy xuất các tài liệu trong đó giá trị của trường lớn hơn hoặc bằng giá trị được chỉ định. Câu lệnh sau sẽ tìm nạp các tài liệu trong đó OrderTotal lớn hơn hoặc bằng 800.
>db.orders.find( { OrderTotal: { $gte: 800.00 } } )
Một câu lệnh SQL tương tự sẽ như sau
SELECT * FROM orders WHERE OrderTotal>=800.00
Ví dụ
>db.Orders.find( { "OrderTotal": { $gte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderTotal: 1000.00
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderTotal: 800.00
}
>
4. Nhà điều hành $ lt
Bạn có thể sử dụng toán tử $ lt để truy xuất các tài liệu trong đó giá trị của trường nhỏ hơn giá trị được chỉ định. Câu lệnh sau sẽ tìm nạp các tài liệu trong đó OrderTotal nhỏ hơn 800.
>db.orders.find( { OrderTotal: { $lt: 800.00 } } )
Một câu lệnh SQL tương tự sẽ như sau
SELECT * FROM orders WHERE OrderTotal<800.00
Ví dụ
>db.Orders.find( { "OrderTotal": { $lt: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderTotal: 600.00
}
>
4. Nhà điều hành $ lte
Bạn có thể sử dụng toán tử $ lte để truy xuất các tài liệu trong đó giá trị của trường nhỏ hơn hoặc bằng giá trị được chỉ định. Câu lệnh sau sẽ tìm nạp các tài liệu trong đó OrderTotal nhỏ hơn hoặc bằng 800.
>db.orders.find( { OrderTotal: { $lte: 800.00 } } )
Một câu lệnh SQL tương tự sẽ như sau
SELECT * FROM orders WHERE OrderTotal<=800.00
Ví dụ
>db.Orders.find( { "OrderTotal": { $lte: 800.00 } } , { Customer: 1, OrderTotal: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderTotal: 800.00
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderTotal: 600.00
}
>
5. Nhà điều hành $ ne
Bạn có thể sử dụng toán tử $ ne để truy xuất các tài liệu trong đó giá trị của trường không bằng giá trị được chỉ định.
>db.orders.find( { PaymentMode: { $ne: "Card" } } )
Một câu lệnh SQL tương tự sẽ như sau
SELECT * FROM orders WHERE PaymentMode != "Card"
Ví dụ
>db.Orders.find( { "PaymentMode": { $ne: "Card" } } , { Customer: 1, PaymentMode: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
PaymentMode":"Cash"
}
>
6. $ in Operator
Bạn có thể sử dụng toán tử $ in để truy xuất các tài liệu trong đó giá trị của trường bằng bất kỳ giá trị nào trong mảng được chỉ định.
>db.orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } )
Ví dụ
>db.Orders.find( { OrderItems.ItemName: { $in: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607534c")
Customer: "abc",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":10},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"journal","Price":"200.00","Qty":2},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
},
{
"_id" : ObjectId("5dd4e2cc0821d3b44607544c"),
Customer: "xyz",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"paper","Price":"10.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":500}
]
}
>
7. Toán tử $ nin
Bạn có thể sử dụng toán tử $ nin để truy xuất các tài liệu trong đó giá trị của trường không bằng bất kỳ giá trị nào trong mảng được chỉ định. Nó cũng sẽ chọn các tài liệu mà trường không tồn tại.
>db.orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } )
Ví dụ
>db.Orders.find( { OrderItems.ItemName: { $nin: ["journal","paper"] } } , { Customer: 1, OrderItems: 1 })
{
"_id" : ObjectId("5dd4e2cc0821d3b44607644c"),
Customer: "ron",
OrderItems:[
{"ItemName":"notebook","Price":"150.00","Qty":5},
{"ItemName":"postcard","Price":"10.00","Qty":00}
]
}
>
Lập chỉ mục
Chúng tôi biết rằng lập chỉ mục là rất quan trọng nếu chúng tôi đang thực hiện các truy vấn trên một cơ sở dữ liệu lớn. Nếu không lập chỉ mục thực hiện một truy vấn có thể tốn kém. Chúng ta có thể thêm một chỉ mục tăng dần đơn giản trên một trường bằng cách sử dụng câu lệnh sau.
>db.Orders.createIndex({"Customer":1})
MongoDB tạo một chỉ mục duy nhất trên trường ‘_id’ theo mặc định. Chỉ mục duy nhất sẽ ngăn chặn việc chèn hai tài liệu có cùng giá trị cho trường đó. Nếu bạn muốn tạo một chỉ mục duy nhất thì câu lệnh sẽ như sau.
db.Orders.createIndex( { "OrderId": 1 }, { unique: true } )
Kết luận
Tôi hy vọng bạn đã học được điều gì đó mới hôm nay, Nếu bạn muốn tìm hiểu thêm một số thứ trên MongoDB, đây là một bài viết thú vị về MongoDB tự lưu trữ, tôi cũng mời bạn thử nội dung của riêng bạn và chia sẻ kinh nghiệm của bạn trong phần bình luận. Ngoài ra, nếu bạn gặp bất kỳ vấn đề nào với bất kỳ định nghĩa nào ở trên, vui lòng hỏi tôi trong phần nhận xét bên dưới.