Tìm đối tượng MongoDB

Trong bài viết "Mẹo nhanh" này, chúng tôi xem xét cách chỉ truy xuất phần tử được truy vấn trong một đối tượng mảng trong MongoDB

Một kịch bản điển hình cho cơ sở dữ liệu NoSQL dựa trên tài liệu là lưu trữ các tài liệu có chứa một mảng các đối tượng, chẳng hạn như các đối tượng này

{
"name": "John",
"cars": [{
"make": "Ford",
"colour": "red"
}, {
"make": "Mercedes",
"colour": "blue"
}]
}
{
"name": "Susan",
"cars": [{
"make": "Fiat",
"colour": "red"
}, {
"make": "BMW",
"colour": "black"
}]
}

Thường thì điều trên được gọi là không chuẩn hóa vì chúng tôi đặt mọi thứ chúng tôi biết về một thực thể dữ liệu nhất định vào một đối tượng tài liệu

Mỗi người có một tài sản

db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
3, là một mảng các đối tượng xe hơi, mỗi người có một tài sản
db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
4 và một tài sản
db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
5

Bây giờ, điều gì sẽ xảy ra nếu chúng ta muốn thực hiện một truy vấn và trả về các tài liệu phù hợp trong đó màu của ô tô là "xanh dương". Bằng cách chạy truy vấn

db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
6 tiêu chuẩn, chúng tôi nhận được toàn bộ tài liệu với tất cả các mục mảng được trả về

db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}

Cập nhật truy vấn trước đó để bao gồm phép chiếu, chúng tôi vẫn nhận được cả hai đối tượng thay vì chỉ có "chiếc xe màu xanh" mà chúng tôi đang tìm kiếm

db.people.find({ 'cars.colour': 'blue' }, { 'cars.colour': 1 }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"cars" : [
{
"colour" : "red"
},
{
"colour" : "blue"
}
]
}

Điều này có thể hiệu quả đối với một số tình huống nhất định;

Để đạt được điều này, chúng ta cần giới thiệu và sử dụng MongoDB's Aggregation. Hãy nghĩ về tập hợp này như một đường dẫn trong đó các tài liệu trải qua nhiều giai đoạn chuyển đổi - bao gồm nhóm các giá trị lại với nhau, thêm các trường được tính toán hoặc thậm chí tạo các đối tượng phụ ảo

Hãy xem cách truy vấn tổng hợp sẽ như thế nào

db.people.aggregate([
{ $match: { 'cars.colour': 'blue' } },
{
$project: {
cars: {
$filter: {
input: '$cars',
as: 'cars',
cond: { $eq: ['$$cars.colour', 'blue'] },
},
},
_id: 0,
},
},
]);

Phần đầu tiên với

db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
0 rất đơn giản giống như phần chúng tôi đã làm trước đây - chúng tôi khớp các tài liệu có màu ô tô là "xanh dương". Sau
db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
0, chúng tôi sử dụng
db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
2 cho phép chúng tôi chuyển tài liệu sang giai đoạn tiếp theo trong quy trình cùng với các trường cụ thể (hiện có hoặc được tính toán). Về cơ bản, chúng tôi xây dựng lại thuộc tính cars, với một điều kiện nhất định như được chỉ định bởi thuộc tính
db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
3 cho
db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
4 - chúng tôi chỉ muốn xem những chiếc ô tô có màu xanh lam và bây giờ chúng tôi đang tham chiếu đầu vào cho tổng hợp của mình (cũng như theo trường
db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
5 . Kết quả sẽ chính xác như những gì chúng ta đang theo đuổi

db.people.find({ 'cars.colour': 'blue' }).pretty();
{
"_id" : ObjectId("5c4ab3bf996018528b1ef283"),
"name" : "John",
"cars" : [
{
"make" : "Ford",
"colour" : "red"
},
{
"make" : "Mercedes",
"colour" : "blue"
}
]
}
2

Và nếu bạn đang thắc mắc, làm thế nào để sử dụng cái này từ một Node. js (hoặc từ bất kỳ SDK MongoDB nào khác cho vấn đề đó), đừng lo lắng, nó không thể đơn giản hơn. Tất cả những gì chúng ta cần là lấy truy vấn đã thấy trước đó và thêm vào Node. js theo cách sau

Làm cách nào để tìm các đối tượng lồng nhau trong MongoDB?

Truy cập tài liệu nhúng/lồng nhau – . using dot notation and when you are using dot notation, then the field and the nested field must be inside the quotation marks.

Chúng ta có thể sử dụng $and trong find trong MongoDB không?

Bạn có thể sử dụng toán tử này trong các phương thức như find(), update(), v.v. theo yêu cầu của bạn . Người vận hành này thực hiện đánh giá ngắn mạch. Nếu biểu thức đầu tiên của toán tử $and đánh giá là sai, thì MongoDB sẽ không đánh giá các biểu thức còn lại trong mảng.

Làm cách nào để tìm kiếm trong mảng đối tượng trong MongoDB?

Bạn có thể thực hiện việc này theo hai cách. .
ElementMatch - $elemMatch (như đã giải thích trong các câu trả lời ở trên) db. người dùng. tìm ({ giải thưởng. { $elemMatch. {phần thưởng. 'Giải thưởng Turing', năm. 1977} } })
Sử dụng $and với find. db. getCollection('người dùng'). tìm ({"$and". [{"giải thưởng. phần thưởng". "Giải thưởng Turing"},{"giải thưởng. năm". 1977}]})

Mục đích của phương thức Find() trong MongoDB là gì?

Phương thức find() trong MongoDB chọn tài liệu trong bộ sưu tập hoặc chế độ xem và trả về con trỏ cho tài liệu đã chọn . Nó có hai tham số. truy vấn và chiếu.