MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB findOne ()

Trong MongoDB, db.collection.findOne() phương thức trả về một tài liệu đáp ứng các tiêu chí truy vấn được chỉ định trên bộ sưu tập hoặc chế độ xem.

Bộ sưu tập collection một phần là tên của bộ sưu tập hoặc chế độ xem cần tìm kiếm.

findOne() tương tự như find() , ngoại trừ findOne() đó chỉ trả về tài liệu đầu tiên phù hợp với tiêu chí bộ lọc, theo thứ tự tự nhiên phản ánh thứ tự của tài liệu trên đĩa.

find() mặt khác, trả về tất cả các tài liệu phù hợp.

Ngoài ra, findOne() trả về tài liệu thực, trong khi find() chỉ trả về một con trỏ cho mỗi tài liệu. Do đó, bạn không thể áp dụng các phương thức con trỏ cho findOne() như bạn có thể làm với find() .

Ví dụ

Giả sử chúng ta có một bộ sưu tập có tên là pets với các tài liệu sau:

 {"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":2, "name":"Bark", "type" :"Dog", "weight":10} {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} {"_id":4, "name" :"Scratch", "type":"Cat", "weight":8} {"_id":5, "name":"Bruce", "type":"Bat", "weight":3}  

Chúng ta có thể sử dụng findOne() để trả lại một tài liệu.

 db.pets.findOne() 

Kết quả:

 {"_id":1, "name":"Wag", "type":"Dog", "weight":20} 

Tại đây, chúng tôi đã tìm kiếm tất cả các tài liệu trong pets thu thập. Chúng tôi biết rằng điều này đã tìm kiếm tất cả các tài liệu vì chúng tôi không cung cấp bất kỳ tiêu chí lọc nào. Chúng tôi thậm chí không cung cấp bất kỳ đối số nào.

Khi được gọi không có đối số, findOne() tìm kiếm tất cả tài liệu từ một bộ sưu tập và trả về tất cả các trường cho tài liệu phù hợp.

Một cách khác để làm như sau:

 db.pets.findOne({}) 

Trong trường hợp này, chúng tôi chuyển một tài liệu trống.

Bằng cách thêm vào tài liệu trống này, chúng tôi có thể bắt đầu lọc kết quả.

Cung cấp truy vấn

Cú pháp thực tế của findOne() như sau:

 db.collection.findOne(query, projection) 

Điều này có nghĩa là bạn có thể chuyển một truy vấn làm đối số đầu tiên và một phép chiếu làm đối số thứ hai.

Nếu bạn chuyển một truy vấn, nó được sử dụng để lọc phạm vi tìm kiếm chỉ những tài liệu phù hợp với truy vấn. Truy vấn là một tài liệu chứa các toán tử truy vấn. Như chúng ta đã thấy trong ví dụ trước, một tài liệu trống trả về tất cả các tài liệu.

Hãy thu hẹp kết quả thành một tập hợp con các tài liệu trong bộ sưu tập.

 db.pets.findOne({"type":"Cat"}) 

Kết quả:

 {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} 

Điều này thu hẹp tìm kiếm chỉ những tài liệu có type trường có giá trị là Cat , rồi đến findOne() trả về tài liệu đầu tiên từ kết quả đó.

Trong trường hợp này, chúng tôi chỉ cần chuyển một tài liệu làm tiêu chí lọc.

Bạn cũng có thể sử dụng toán tử truy vấn. Những điều này cho phép bạn áp dụng các tiêu chí cụ thể hơn cho truy vấn của mình.

Ví dụ:

 db.pets.findOne({"weight": { $lt: 10 }}) 

Kết quả:

 {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} 

Tài liệu được nhúng

Nếu bạn có tài liệu chứa tài liệu được nhúng, bạn có thể sử dụng các phương pháp sau để truy vấn dữ liệu trong tài liệu được nhúng.

  • Ký hiệu dấu chấm (ví dụ:field.nestedfield: <value> )
  • Biểu mẫu lồng nhau (ví dụ:{field: { nestedfield: <value> } } ). Lưu ý rằng tùy chọn này chỉ khả dụng trong MongoDB 4.4.

Giả sử chúng ta chèn tài liệu sau.

 db.pets.insertOne ({"_id":6, "name":"Fetch", "type":"Dog", "specs":{"height":400, "weight":15, " color ":" brown "}}) 

Chúng tôi có thể sử dụng ký hiệu dấu chấm để truy vấn trong tài liệu được nhúng.

 db.pets.findOne({ "specs.height": 400 }) 

Kết quả:

 {"_id":6, "name":"Fetch", "type":"Dog", "specs":{"height":400, "weight":15, "color":"brown" }} 

Truy vấn sau trả về cùng một tài liệu, ngoại trừ lần này, chúng tôi tham chiếu tài liệu nhúng bằng biểu mẫu lồng nhau.

 db.pets.findOne({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 }) 

Kết quả:

 {"_id":6, "name":"Fetch", "type":"Dog", "specs":{"height":400, "weight":15, "color":"brown" }} 

Khi sử dụng biểu mẫu lồng nhau, truy vấn phải khớp chính xác với toàn bộ tài liệu được nhúng. Ví dụ:truy vấn sau không khớp:

 db.pets.findOne({ 
    "specs" : {
		"height" : 400
	}
 }) 

Kết quả:

 null 

Mảng

Bạn có thể tham chiếu dữ liệu trong mảng bằng cách tham chiếu phần tử mảng theo chỉ số của nó hoặc theo giá trị của nó.

Giả sử chúng ta chèn tài liệu sau:

 db.pets.insertOne ({"_id":7, "name":"Jake", "type":"Dog", "Prize":["Top Dog", "Best Dog", "Biggest Dog "]}) 

Nếu chúng tôi muốn tìm tất cả các con chó đạt giải thưởng Top Dog, chúng tôi có thể viết truy vấn sau (truy vấn này sẽ trả về con chó ở trên).

 db.pets.findOne({ 
    "awards": "Top Dog"
}) 

Kết quả:

 {"_id":7, "name":"Jake", "type":"Dog", "Prize":["Top Dog", "Best Dog", "Biggest Dog"]} 

Bạn cũng có thể chỉ định chỉ mục phần tử, như sau:

 db.pets.findOne({ 
    "awards.0": "Top Dog"
}) 

Thực hiện điều đó yêu cầu giá trị được chỉ định phải ở chỉ mục được chỉ định. Do đó, truy vấn sau không trả về cùng một con chó.

 db.pets.findOne({ 
    "awards.1": "Top Dog"
}) 

Lưu ý rằng mảng dựa trên 0, vì vậy chỉ số 0 chỉ định phần tử đầu tiên, 1 chỉ định phần tử thứ hai, v.v.

Phép chiếu

Theo mặc định, tất cả các trường tài liệu được trả về khi bạn sử dụng findOne() . Nhưng bạn có thể sử dụng phép chiếu để giảm số lượng trường được trả về nếu cần.

Bạn có thể nhớ lại rằng cú pháp cho findOne() như sau:

 db.collection.findOne(query, projection) 

Nơi query cung cấp tiêu chí lọc (mà chúng tôi đã thực hiện trong các ví dụ trên) và projection là một phép chiếu tùy chọn chỉ định trường nào sẽ trả về từ bất kỳ tài liệu phù hợp nào. Do đó, nếu chúng ta muốn sử dụng một phép chiếu, chúng ta chỉ cần đặt nó sau truy vấn.

Khi bạn sử dụng phép chiếu, bạn có thể chỉ định các trường để bao gồm , các trường để loại trừ , hoặc cả hai. Để thực hiện việc này, hãy liệt kê tên của trường và 1 (để bao gồm nó) hoặc 0 (để loại trừ nó).

Dưới đây là một ví dụ về việc sử dụng phép chiếu để chỉ định các trường để bao gồm:

 db.pets.findOne({}, { name: 1, type: 1 }) 

Kết quả:

 {"_id":1, "name":"Wag", "type":"Dog"} 

Lưu ý rằng _id trường được trả về mặc dù chúng tôi không bao gồm trường đó trong phép chiếu của mình. Trường này là một ngoại lệ và được bao gồm theo mặc định.

Nếu bạn không muốn _id trường được trả về, bạn cần phải loại trừ nó một cách rõ ràng.

 db.pets.findOne({}, { _id: 0, name: 1, type: 1 }) 

Kết quả:

 {"name":"Wag", "type":"Dog"} 

Đây là một ví dụ khác, lần này chúng tôi chỉ chỉ định những trường nào cần loại trừ.

 db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 }) 

Kết quả:

 {"name":"Wag", "type":"Dog"} 

Các phép chiếu khác

Có nhiều thứ khác bạn có thể làm với các phép chiếu. Ví dụ:bắt đầu từ MongDB 4.4, bạn có thể sử dụng các biểu thức tổng hợp để chỉ định giá trị của một trường dự kiến.

Ví dụ:

 db.pets.findOne({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Kết quả:

 {"n":"Wag", "t":"Dog", "w":20} 

Ở đây, chúng tôi đã đổi tên các tên trường. Chúng tôi đã làm điều này bằng cách chỉ định một tên mới cho mỗi trường dưới dạng một chuỗi ký tự, bằng cách sử dụng $fieldName cú pháp để xuất giá trị trường đó. Kết quả hơi giống như sử dụng bí danh trong SQL.

Thông tin thêm

Xem tài liệu MongoDB để biết thêm thông tin.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách tìm giá trị tối thiểu trong mongodb

  2. Tìm theo id với mgo

  3. Ghi nhật ký các truy vấn MongoDB với Spring Boot

  4. Không thể sử dụng lệnh mongo, hiển thị lệnh không tìm thấy trên mac

  5. Quản lý cơ sở dữ liệu hiện đại:ClusterControl - Hướng dẫn