MongoDB cung cấp db.collection.find()
phương pháp để truy vấn tài liệu trong một bộ sưu tập.
db.collection.find()
chọn các tài liệu trong một bộ sưu tập và trả về một con trỏ đến các tài liệu đã chọn.
Trả lại tất cả tài liệu
Ví dụ này trả về tất cả tài liệu từ nhạc sĩ bộ sưu tập:
db.musicians.find()
Kết quả:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
Nó trả về tất cả các tài liệu vì chúng tôi không chuyển bất kỳ tham số nào làm tiêu chí lọc.
Truy vấn trên là phiên bản rút gọn của db.musicians.find( {} )
. Trong truy vấn trên, chúng tôi đã bỏ qua dấu ngoặc nhọn {}
. Điều này hoàn toàn hợp lệ khi làm việc với MongoDB.
Thêm tiêu chí lọc
Bạn có thể lọc kết quả bằng cách chỉ cung cấp các tiêu chí mà bạn quan tâm.
Ví dụ:nếu chúng tôi chỉ quan tâm đến Màu tím đậm từ các nghệ sĩ bộ sưu tập:
db.artists.find({ artistname : "Deep Purple" })
Kết quả:
{ "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
Định dạng kết quả
Bạn có thể thấy các kết quả trên hơi khó đọc. Tài liệu được trả về dưới dạng một dòng văn bản dài.
Bạn có thể sử dụng pretty()
để định dạng kết quả sao cho chúng dễ đọc hơn một chút.
Chỉ cần thêm pretty()
cuối cùng, như thế này:
db.artists.find({ artistname : "Deep Purple" }).pretty()
Kết quả:
{ "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
Các tùy chọn lọc khác
Dưới đây là một số cách lọc kết quả khác.
Chỉ định AND
Điều kiện
Bạn có thể chỉ định rằng chỉ các tài liệu chứa hai hoặc nhiều giá trị đã chỉ định mới được trả về.
Trong ví dụ này, chúng tôi chỉ định rằng chỉ những nhạc sĩ chơi trống và nơi sinh trước năm 1950 nên được trả lại. Chỉ những tài liệu phù hợp với cả hai tiêu chí mới được trả lại.
db.musicians.find( { instrument: "Drums", born: { $lt: 1950 } } )
Kết quả:
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
Chỉ định OR
Điều kiện
Bạn cũng có thể chỉ định rằng một hoặc giá trị khác phải đúng. Miễn là một trong các điều kiện đúng, tài liệu sẽ được trả lại.
Trong ví dụ này, chúng tôi muốn các tài liệu có các nhạc sĩ chơi trống hoặc sinh trước năm 1950.
db.musicians.find( { $or: [ { instrument: "Drums" }, { born: { $lt: 1950 } } ] } )
Kết quả:
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
$in
Nhà điều hành
$in
toán tử cho phép bạn cung cấp một danh sách các giá trị. Nếu một tài liệu chứa bất kỳ giá trị nào trong số đó, nó sẽ được trả về.
Sử dụng ví dụ sau, chúng tôi đang tìm kiếm tất cả các nhạc sĩ có giọng hát hoặc chơi guitar.
db.musicians.find( { instrument: { $in: [ "Vocals", "Guitar" ] } } )
Kết quả
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
Truy vấn một mảng tài liệu
Ví dụ này truy vấn một mảng tài liệu. Nó tìm các album được phát hành sau năm 2000.
db.artists.find( { albums: { $elemMatch: { year: { $gt: 2000 } } } } ).pretty()
Kết quả:
{ "_id" : ObjectId("578217c248ef8c6b3ffb015a"), "artistname" : "Robben Ford", "albums" : [ { "album" : "Bringing it Back Home", "year" : 2013, "genre" : "Blues" }, { "album" : "Talk to Your Daughter", "year" : 1988, "genre" : "Blues" } ] } { "_id" : ObjectId("578217c248ef8c6b3ffb015b"), "artistname" : "Snoop Dogg", "albums" : [ { "album" : "Tha Doggfather", "year" : 1996, "genre" : "Rap" }, { "album" : "Reincarnated", "year" : 2013, "genre" : "Reggae" } ] }
Bạn sẽ nhận thấy rằng những kết quả này cũng chứa các album từ trước năm 2000. Điều này đúng - đó là cách hoạt động của cơ sở dữ liệu hướng tài liệu. Mọi truy vấn sẽ trả về toàn bộ tài liệu (nhưng chỉ những tài liệu phù hợp với tiêu chí được chỉ định).
db.collection.findOne()
Phương pháp
Bạn có thể sử dụng db.collection.findOne()
để trả về một tài liệu đáp ứng các tiêu chí truy vấn đã chỉ định.
Nếu nhiều tài liệu đáp ứng tiêu chí, thì chỉ tài liệu đầu tiên được trả về, như được xác định bởi thứ tự tự nhiên của tài liệu trên đĩa.
Vì vậy, tìm kiếm toàn bộ bộ sưu tập như thế này:
db.musicians.findOne( )
Sẽ chỉ trả lại một tài liệu:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
Nếu chúng tôi thay đổi findOne()
thành find()
như thế này:
db.musicians.find()
Chúng tôi thấy rằng thực tế có 8 tài liệu trong bộ sưu tập:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }