1. Tổng quan
Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách lấy một giá trị từ MongoDB theo tên khóa. Chúng ta sẽ khám phá các phương pháp khác nhau của MongoDB, để tìm nạp các tên trường chính của tài liệu dựa trên các bộ lọc được áp dụng. Trước tiên, chúng tôi sẽ sử dụng find hoặc findone phương pháp để tìm nạp dữ liệu được yêu cầu và sau đó sử dụng tổng hợp phương pháp. Ở đây, chúng tôi sẽ viết các truy vấn trong cả truy vấn trình bao MongoDB và mã trình điều khiển Java.
Hãy xem các cách khác nhau để truy xuất giá trị trong MongoDB theo tên trường.
2. Khởi tạo cơ sở dữ liệu
Để bắt đầu, chúng tôi cần thiết lập cơ sở dữ liệu mới baeldung và một bộ sưu tập mới, du lịch :
use baeldung;
db.createCollection(travel);
Bây giờ, hãy thêm một số dữ liệu giả vào bộ sưu tập bằng cách sử dụng insertMany phương thức của MongoDB:
db.travel.insertMany([
{
"passengerId":145,
"passengerName":"Nathan Green",
"passengerAge":25,
"sourceStation":"London",
"destinationStation":"Birmingham",
"seatType":"Slepper",
"emailAddress":"[email protected]"
},
{
"passengerId":148,
"passengerName":"Kevin Joseph",
"passengerAge":28,
"sourceStation":"Manchester",
"destinationStation":"London",
"seatType":"Slepper",
"emailAddress":"[email protected]"
},
{
"passengerId":154,
"passengerName":"Sheldon burns",
"passengerAge":26,
"sourceStation":"Cambridge",
"destinationStation":"Leeds",
"seatType":"Slepper",
"emailAddress":"[email protected]"
},
{
"passengerId":168,
"passengerName":"Jack Ferguson",
"passengerAge":24,
"sourceStation":"Cardiff",
"destinationStation":"Coventry",
"seatType":"Slepper",
"emailAddress":"[email protected]"
}
]);
insertMany ở trên truy vấn sẽ trả về JSON sau:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623d7f079d55d4e137e47825"),
ObjectId("623d7f079d55d4e137e47826"),
ObjectId("623d7f079d55d4e137e47827"),
ObjectId("623d7f079d55d4e137e47828")
]
}
Cho đến bây giờ, chúng tôi đã chèn dữ liệu giả vào bộ sưu tập du lịch .
3. Sử dụng find Phương pháp
Tìm thấy phương thức tìm và trả về tài liệu phù hợp với tiêu chí truy vấn được chỉ định trên bộ sưu tập. Nếu nhiều tài liệu phù hợp với điều kiện, thì nó sẽ trả về tất cả các tài liệu dựa trên thứ tự của tài liệu trên đĩa. Ngoài ra, trong MongoDB, find phương thức hỗ trợ phép chiếu tham số trong truy vấn. Nếu chúng tôi chỉ định một tham số chiếu trong find , nó sẽ trả về tất cả các tài liệu chỉ chứa các trường chiếu.
Một điểm chính cần lưu ý là _id trường luôn được bao gồm trong phản hồi trừ khi bị xóa rõ ràng.
Để chứng minh, chúng ta hãy xem xét truy vấn shell để chiếu một trường khóa:
db.travel.find({},{"passengerId":1}).pretty();
Câu trả lời cho truy vấn trên sẽ là:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
Ở đây, trong truy vấn này, chúng tôi chỉ đơn giản chiếu hành khách. Bây giờ chúng ta hãy xem xét trường chính với việc loại trừ _id :
db.travel.find({},{"passengerId":1,"_id":0}).pretty();
Truy vấn trên sẽ có phản hồi sau:
{ "passengerId" : 145 }
{ "passengerId" : 148 }
{ "passengerId" : 154 }
{ "passengerId" : 168 }
Ở đây, trong truy vấn này, chúng tôi đã loại trừ _id trường từ phép chiếu phản hồi. Hãy xem mã trình điều khiển Java cho truy vấn trên:
MongoClient mongoClient = new MongoClient("localhost", 27017);
DB database = mongoClient.getDB("baeldung");
DBCollection collection = database.getCollection("travel");
BasicDBObject queryFilter = new BasicDBObject();
BasicDBObject projection = new BasicDBObject();
projection.put("passengerId", 1);
projection.put("_id", 0);
DBCursor dbCursor = collection.find(queryFilter, projection);
while (dbCursor.hasNext()) {
System.out.println(dbCursor.next());
}
Trong đoạn mã trên, trước tiên, chúng tôi đã tạo một MongoClient kết nối với máy chủ mongo cục bộ đang chạy trên cổng 27017 . Tiếp theo, chúng tôi sử dụng find , có hai tham số, queryFilter, và phép chiếu. Truy vấn DBObject chứa các bộ lọc mà chúng tôi cần để tìm nạp dữ liệu. Tại đây, chúng tôi đã in tất cả các trường dự kiến của tài liệu du lịch bằng DBCursor .
4. Sử dụng tổng hợp Phương pháp
Tổng hợp các hoạt động trong MongoDB xử lý hồ sơ và tài liệu dữ liệu và trả về kết quả được tính toán. Nó thu thập các giá trị từ các tài liệu khác nhau và nhóm chúng lại với nhau trước khi thực hiện các loại hoạt động khác nhau trên dữ liệu được nhóm, chẳng hạn như tổng, trung bình, tối thiểu, tối đa, v.v.
Chúng tôi có thể sử dụng đường ống tổng hợp MongoDB khi chúng tôi cần thực hiện tổng hợp phức tạp hơn. Đường ống tổng hợp là tập hợp các giai đoạn được kết hợp với cú pháp truy vấn MongoDB để mang lại kết quả tổng hợp.
Hãy xem xét truy vấn tổng hợp để truy xuất giá trị theo tên khóa:
db.travel.aggregate([
{
"$project":{
"passengerId":1
}
}
]).pretty();
Câu trả lời cho truy vấn tổng hợp ở trên sẽ là:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
Trong trường hợp này, chúng tôi đã sử dụng $ project giai đoạn của đường ống tổng hợp. $ dự án chỉ định những trường nào để bao gồm hoặc loại trừ. Trong truy vấn của chúng tôi, chúng tôi chỉ chuyển hành kháchId vào giai đoạn chiếu.
Hãy xem mã trình điều khiển Java cho truy vấn trên:
ArrayList<Document> response = new ArrayList<>();
ArrayList<Document> pipeline = new ArrayList<>(Arrays.asList(new Document("$project", new Document("passengerId", 1L))));
database = mongoClient.getDatabase("baeldung");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- " + response);
Chúng ta cũng có thể viết đường dẫn tổng hợp theo cách sau:
ArrayList<Document> response = new ArrayList<>();
ArrayList<Bson> pipeline = new ArrayList<>(Arrays.asList(
project(fields(Projections.exclude("_id"), Projections.include("passengerId")))));
MongoDatabase database = mongoClient.getDatabase("baeldung");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- "+response);
Chúng tôi đã tạo một đường dẫn tổng hợp với mã trình điều khiển java và đặt giai đoạn dự án chỉ để bao gồm customerId đồng ruộng. Cuối cùng, chúng tôi đã chuyển đường ống tổng hợp đến tổng hợp phương pháp để truy xuất dữ liệu.