Uncategorized

MongoDB: Truy vấn trong Collection

MongoDB: Truy vấn trong Collection

| |

MongoDB cung cấp phương thức db.collection.find() để truy vấn các document thuộc collection đó.

Phương thức db.collection.find()  sẽ select các document trong collection và trả về một cursor

Lấy ra toàn bộ Documents

Ví dụ dưới đây sẽ trả về toàn bộ document của  director:

db.director.find()

kết quả

{_id: 1, name: "Steven Spielberg", age: 72, children: 6}
{_id: 2, name: "Christopher Nolan", age: 49, children: 4}
{ _id: 3, name: "Quentin Tarantino", age: 56, children: 0}
{ _id: 4, name: "Jane Campion", age: 65, children: 2}
{ _id: 5, name: "David Fincher", age: 57, children: 1}
{ _id: 6, name: "Peter Jackson", age: 57, children: 2}
{ _id: 7, name: "Michael Bay", age: 54, children: 0}
{ _id: 8, name: "Ron Howard", age: 65, children: 4}

Câu lệnh trên trả về toàn bộ document bởi vì chúng ta không thêm bất kì tham số nào để lọc dữ liệu.

câu truy vấn trên là rút gọn của db.cast.find( {} ). Việc bỏ đi dấu ngoặc {} là cú pháp hoàn toàn đúng trong MongoDB.

Lọc dữ liệu

Giống như where trong sql, MongoDB cũng cung cấp cách thức để lọc dữ liệu khi truy vấn:

db.cast.find({name: "Matt Damon"})

Kết quả:

{ "_id" : ObjectId("5781c9ac48ef8c6b3ffb014a"), name: "Matt Damon", age: 48, movies: [ { movie: "The Martian", year: 2015, genre: "Drama" } { movie: "Good Will Hunting", year: 1997, genre: "Drama" } ] }

Định dạng kết quả

Có thể thấy ngay klết quả vừa hiển thị ở bên trên rất khó quan sát. Phương thức pretty() sẽ định dạng kết quả bên trên giúp chúng ta dễ theo dõi hơn:

db.cast.find({name: "Matt Damon"}).pretty()

Kết quả:

{  
   "_id":ObjectId("5781c9ac48ef8c6b3ffb014a"),
   name:"Matt Damon",
   age:48,
   movies:[  
      {  
         movie:"The Martian",
         year:2015,
         genre:"Drama"
      }      {  
         movie:"Good Will Hunting",
         year:1997,
         genre:"Drama"
      }
   ]
}
Lưu ý: Kể từ giờ trở đi, kết quả của các câu truy vấn sẽ được để ở dạng pretty() để tiện theo dõi.

Các tùy chọn lọc (filtering)

Dưới đây là một số điều kiện lọc quen thuộc:

Điều kiện và (AND)

And được sử dụng khi chúng ta muốn lấy ra document mà thỏa mãn nhiều điều kiện khác nhau

Trong ví dụ dưới đây, chúng ta sẽ lọc ra các diễn viên có tuổi lớn hơn 40 và tham gia thể loại phim hoạt hình:

db.cast.find( { genre: "animation", age: { $gt: 40 } })

Kết quả:

{
  "_id" : ObjectId("578217c248ef8c6b3ffb015b"),
  name: "Keanu Reeves",
  age: 54,
  movies: [
    {
      movie: "John Wick: Chapter 3 – Parabellum",
      year: 2019,
      genre: "Action"
    }{
      movie: "Toy Story 4",
      year: 2019,
      genre: "Animation"
    }
  ]
},

Điều kiện hoặc (OR)

Khi chúng ta muốn kết quả thỏa mãi một trong các điều kiện đặt ra. điều kiện hoặc sẽ được sử dụng.

Câu lệnh dưới đây sẽ lấy ra các diễn viên có tuổi đời lớn hơn 50 hoặc đã tham gia thể loại phim drama:

db.cast.find(
  {
    $or: [ { genre: "drama" }, { age: { $gt: 50 } } ]
  }
)

Kết quả:

{  
   "_id":ObjectId("578217c248ef8c6b3ffb015a"),
   name:"Keanu Reeves",
   age:54,
   movies:[  
      {  
         movie:"John Wick: Chapter 3 – Parabellum",
         year:2019,
         genre:"Action"
      }      {  
         movie:"Toy Story 4",
         year:2019,
         genre:"Animation"
      }
   ]
}
{
 "_id":ObjectId("578217c248ef8c6b3ffb015b"),
  name: "Matt Damon",
  age: 48,
  movies: [
    {
      movie: "The Martian",
      year: 2015,
      genre: "Drama"
    }
    {
      movie: "Good Will Hunting",
      year: 1997,
      genre: "Drama"
    }
  ]
}

Toán tử $in

Toán tử $in trả về documents nếu chúng chứa bất kì giá trị nào nằm trong danh sách đã cho:

db.director.find( { name: { $in: [ "Quentin Tarantino", "Jane Campion" ] } } )

Kết quả :

{
  _id: 3,
  name: "Quentin Tarantino",
  age: 56,
  children: 0
},
{
  _id: 4,
  name: "Jane Campion",
  age: 65,
  children: 2
}.

Truy vấn mảng Document

Chúng ta sẽ truy vấn ra những diễn viên đóng các bộ phim trước năm 2014

db.cast.find(
  {
    movies: {
      $elemMatch: {
        year: { $lt: 2014 }    
      } 
    }
  }
)

Kết quả:

{
  "_id": ObjectId("578217c248ef8c6b3ffb015d"),
  name: "Matt Damon",
  age: 48,
  movies: [
    {
      movie: "The Martian",
      year: 2015,
      genre: "Drama"
    }{
      movie: "Good Will Hunting",
      year: 1997,
      genre: "Drama"
    }
  ]
}
{
  "_id": ObjectId("578217c248ef8c6b3ffb015c"),
  name: "Adam Sandler",
  age: 52,
  movies: [
    {
      movie: "50 First Dates",
      year: 2004,
      genre: "Romance"
    }{
      movie: "Murder Mystery",
      year: 2019,
      genre: "Mystery/Crime"
    }
  ]
}

Có thể thấy kết quả bên trên bao gồm cả những bộ phim năm 2019 và 2015. Điều này hoàn toàn đúng. Bởi vì câu truy vấn sẽ trả về toàn bộ nội dung của một document, nếu một phần tử của nó thỏa mãn điều kiện truy vấn (Trong trường hợp này là một mảng).

Phương thức db.collection.findOne()

Như tên gọi của nó. Phương thức này được sử dụng để láy ra chỉ một Document thỏa mãn điều kiện cho trước.

Trong trường hợp có nhiều Document thỏa mãn điều kiện, sẽ lấy ra phần tử đầu tiên tìm được.

db.director.findOne().pretty()

Sẽ chỉ trả về kết quả đầu tiên:

{
   _id: 2,
   name: "Christopher Nolan",
   age: 49,
  children: 4
 }

Nếu sử dụng find() thay vì findOne():

db.director.find().pretty()

Chúng ta sẽ thấy tất cả các Document được trả về:

{
  _id: 1,
  name: "Steven Spielberg",
  age: 72,
  children: 6
}
{
  _id: 2,
  name: "Christopher Nolan",
  age: 49,
  children: 4
},
{
  _id: 3,
  name: "Quentin Tarantino",
  age: 56,
  children: 0
},
{
  _id: 4,
  name: "Jane Campion",
  age: 65,
  children: 2
},
{
  _id: 5,
  name: "David Fincher",
  age: 57,
  children: 1
},
{
  _id: 6,
  name: "Peter Jackson",
  age: 57,
  children: 2
},
{
  _id: 7,
  name: "Michael Bay",
  age: 54,
  children: 0
},
{
  _id: 8,
  name: "Ron Howard",
  age: 65,
  children: 4
}

 

 

    Previous

    MongoDB: Tạo mới Document

    MongoDB: Truy vấn với trường chỉ định

    Next

    Leave a Comment

    Subscribe

    A lead capture sample form