Làm cách nào để lấy một phần tử từ mảng trong MongoDB?

Để tìm kiếm mảng đối tượng trong MongoDB, bạn có thể sử dụng toán tử $elemMatch. Toán tử này cho phép chúng ta tìm kiếm nhiều hơn một thành phần từ một đối tượng mảng

Để hiểu khái niệm trên, chúng ta hãy tạo một bộ sưu tập với tài liệu. Truy vấn để tạo một bộ sưu tập với một tài liệu như sau -

> db.searchArrayDemo.insertOne({"EmployeeFirstName":"Adam","EmployeeLastName":"Smith","EmployeeDateOfBirth":new ISODate("1992-01-31 13:45:10"),
   .. "EmployeeSkills":["Spring and Hibernate Framework","Machine Learning"],
   .. "EmployeeDetails":[
      .. {
         .. "EmployeePerformanceArea":"Java",
         .. "Year":2001
      .. },
      .. {
      .. "EmployeePerformanceArea":"Python",
         .. "Year":2005
      .. }
   .. ]
.. }
.. );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c77b3812386c62d05142a6a")
}
> db.searchArrayDemo.insertOne({"EmployeeFirstName":"Carol","EmployeeLastName":"Taylor",
   "EmployeeDateOfBirth":new ISODate("1993-04-21 11:10:20"),
   "EmployeeSkills":["C++","Cloud Computing"], "EmployeeDetails":[ {
   "EmployeePerformanceArea":"C++", "Year":1998 }, { "EmployeePerformanceArea":"C++
   Game Developer", "Year":2007 } ] } );
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c77b58f2386c62d05142a6b")
}

Hiển thị tất cả các tài liệu từ một bộ sưu tập với sự trợ giúp của phương thức find(). Truy vấn như sau -

> db.searchArrayDemo.find().pretty();

Sau đây là đầu ra -

{
   "_id" : ObjectId("5c77b3812386c62d05142a6a"),
   "EmployeeFirstName" : "Adam",
   "EmployeeLastName" : "Smith",
   "EmployeeDateOfBirth" : ISODate("1992-01-31T13:45:10Z"),
   "EmployeeSkills" : [
      "Spring and Hibernate Framework",
      "Machine Learning"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "Java",
         "Year" : 2001
      },
      {
         "EmployeePerformanceArea" : "Python",
         "Year" : 2005
      }
   ]
}
{
   "_id" : ObjectId("5c77b58f2386c62d05142a6b"),
   "EmployeeFirstName" : "Carol",
   "EmployeeLastName" : "Taylor",
   "EmployeeDateOfBirth" : ISODate("1993-04-21T11:10:20Z"),
   "EmployeeSkills" : [
      "C++",
      "Cloud Computing"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "C++",
         "Year" : 1998
      },
      {
         "EmployeePerformanceArea" : "C++ Game Developer",
         "Year" : 2007
      }
   ]
}

Đây là truy vấn để tìm kiếm trong một mảng đối tượng trong MongoDB

Trường hợp 1

Khi phần tử đã cho được tìm thấy

Truy vấn như sau -

> db.searchArrayDemo.find({EmployeeDetails:{$elemMatch:{EmployeePerformanceArea : "C++", Year : 1998}}}).pretty();

Sau đây là đầu ra -

{
   "_id" : ObjectId("5c77b58f2386c62d05142a6b"),
   "EmployeeFirstName" : "Carol",
   "EmployeeLastName" : "Taylor",
   "EmployeeDateOfBirth" : ISODate("1993-04-21T11:10:20Z"),
   "EmployeeSkills" : [
      "C++",
      "Cloud Computing"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "C++",
         "Year" : 1998
      },
      {
         "EmployeePerformanceArea" : "C++ Game Developer",
         "Year" : 2007
      }
   ]
}

trường hợp 2

Khi không tìm thấy phần tử đã cho

Truy vấn như sau -

> db.searchArrayDemo.find({EmployeeDetails:{$elemMatch:{EmployeePerformanceArea : "C", Year : 1996}}}).pretty();

Ở đây bạn sẽ không nhận được gì khi không tìm thấy phần tử đã cho

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.searchArrayDemo.find().pretty();
9, là một mảng các đối tượng xe hơi, mỗi người có một tài sản
{
   "_id" : ObjectId("5c77b3812386c62d05142a6a"),
   "EmployeeFirstName" : "Adam",
   "EmployeeLastName" : "Smith",
   "EmployeeDateOfBirth" : ISODate("1992-01-31T13:45:10Z"),
   "EmployeeSkills" : [
      "Spring and Hibernate Framework",
      "Machine Learning"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "Java",
         "Year" : 2001
      },
      {
         "EmployeePerformanceArea" : "Python",
         "Year" : 2005
      }
   ]
}
{
   "_id" : ObjectId("5c77b58f2386c62d05142a6b"),
   "EmployeeFirstName" : "Carol",
   "EmployeeLastName" : "Taylor",
   "EmployeeDateOfBirth" : ISODate("1993-04-21T11:10:20Z"),
   "EmployeeSkills" : [
      "C++",
      "Cloud Computing"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "C++",
         "Year" : 1998
      },
      {
         "EmployeePerformanceArea" : "C++ Game Developer",
         "Year" : 2007
      }
   ]
}
0 và một tài sản
{
   "_id" : ObjectId("5c77b3812386c62d05142a6a"),
   "EmployeeFirstName" : "Adam",
   "EmployeeLastName" : "Smith",
   "EmployeeDateOfBirth" : ISODate("1992-01-31T13:45:10Z"),
   "EmployeeSkills" : [
      "Spring and Hibernate Framework",
      "Machine Learning"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "Java",
         "Year" : 2001
      },
      {
         "EmployeePerformanceArea" : "Python",
         "Year" : 2005
      }
   ]
}
{
   "_id" : ObjectId("5c77b58f2386c62d05142a6b"),
   "EmployeeFirstName" : "Carol",
   "EmployeeLastName" : "Taylor",
   "EmployeeDateOfBirth" : ISODate("1993-04-21T11:10:20Z"),
   "EmployeeSkills" : [
      "C++",
      "Cloud Computing"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "C++",
         "Year" : 1998
      },
      {
         "EmployeePerformanceArea" : "C++ Game Developer",
         "Year" : 2007
      }
   ]
}
1

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

{
   "_id" : ObjectId("5c77b3812386c62d05142a6a"),
   "EmployeeFirstName" : "Adam",
   "EmployeeLastName" : "Smith",
   "EmployeeDateOfBirth" : ISODate("1992-01-31T13:45:10Z"),
   "EmployeeSkills" : [
      "Spring and Hibernate Framework",
      "Machine Learning"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "Java",
         "Year" : 2001
      },
      {
         "EmployeePerformanceArea" : "Python",
         "Year" : 2005
      }
   ]
}
{
   "_id" : ObjectId("5c77b58f2386c62d05142a6b"),
   "EmployeeFirstName" : "Carol",
   "EmployeeLastName" : "Taylor",
   "EmployeeDateOfBirth" : ISODate("1993-04-21T11:10:20Z"),
   "EmployeeSkills" : [
      "C++",
      "Cloud Computing"
   ],
   "EmployeeDetails" : [
      {
         "EmployeePerformanceArea" : "C++",
         "Year" : 1998
      },
      {
         "EmployeePerformanceArea" : "C++ Game Developer",
         "Year" : 2007
      }
   ]
}
2 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

________số 8

Đ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 trong đó màu của ô 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 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.searchArrayDemo.find().pretty();
8

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 phần tử cụ thể trong mảng trong MongoDB?

Để truy vấn xem trường mảng có chứa ít nhất một phần tử có giá trị được chỉ định hay không, hãy sử dụng bộ lọc { . Để chỉ định điều kiện cho các phần tử trong trường mảng, hãy sử dụng các toán tử truy vấn trong tài liệu bộ lọc truy vấn. {

Làm cách nào để lấy phần tử đầu tiên từ mảng trong MongoDB?

Cách chọn phần tử đầu tiên trong một mảng trong truy vấn MongoDB .
Nếu toán hạng phân giải thành một mảng không trống thì $first trả về phần tử đầu tiên trong mảng
Nếu toán hạng phân giải thành một mảng trống [] thì $first không trả về giá trị
Nếu toán hạng là null hoặc bị thiếu thì $first trả về null

Làm cách nào để sử dụng mảng trong MongoDB?

Làm việc với mảng trong MongoDB .
Giới thiệu. .
Tạo và truy vấn tài liệu. .
Thêm một phần tử mảng. .
Cập nhật một phần tử mảng. .
Xóa một phần tử mảng. .
Thêm một Trường mới cho tất cả các Đối tượng trong Mảng. .
Cập nhật một phần tử mảng cụ thể dựa trên một điều kiện. .
Phần kết luận

Làm cách nào để lọc các phần tử mảng trong MongoDB?

Lọc phần tử mảng MongoDB Sử dụng toán tử $Filter . đầu vào - Điều này đại diện cho mảng mà chúng tôi muốn trích xuất. cond - Điều này đại diện cho tập hợp các điều kiện phải được đáp ứng. as – Trường tùy chọn này chứa tên cho biến đại diện cho từng phần tử của mảng đầu vào.