Làm cách nào để chọn một trường duy nhất cho tất cả các tài liệu trong bộ sưu tập MongoDB?


223

Trong MongoDB của tôi, tôi có một bộ sưu tập sinh viên với 10 bản ghi có các trường nameroll. Một kỷ lục của bộ sưu tập này là:

{
    "_id" : ObjectId("53d9feff55d6b4dd1171dd9e"),
    "name" : "Swati",
    "roll" : "80",
}

Tôi muốn truy xuất trường rollchỉ cho tất cả 10 bản ghi trong bộ sưu tập như chúng ta sẽ làm trong cơ sở dữ liệu truyền thống bằng cách sử dụng:

SELECT roll FROM student

Tôi đã đi qua nhiều blog nhưng tất cả đều dẫn đến một truy vấn phải có WHEREmệnh đề trong đó, ví dụ:

db.students.find({ "roll": { $gt: 70 })

Truy vấn tương đương với:

SELECT * FROM student WHERE roll > 70

Yêu cầu của tôi là chỉ tìm một khóa duy nhất mà không có bất kỳ điều kiện nào. Vì vậy, các hoạt động truy vấn cho điều đó là gì.


@NeilLunn Cảm ơn bạn đã liên kết SQL với Ánh xạ MongoDB . Không biết làm thế nào tôi bỏ lỡ điều này.
Shipra Swati

Câu trả lời:


255

Từ các tài liệu MongoDB :

Một phép chiếu rõ ràng có thể bao gồm một số lĩnh vực. Trong thao tác sau, phương thức find () trả về tất cả các tài liệu khớp với truy vấn. Trong tập kết quả, chỉ có các mục và qty trường và theo mặc định, trường _id trả về trong các tài liệu khớp.

db.inventory.find ({loại: 'thực phẩm'}, {mục: 1, qty: 1})

Trong ví dụ này từ các folks tại Mông Cổ, các văn bản trở lại sẽ chỉ chứa các lĩnh vực item, qty_id.


Do đó, bạn sẽ có thể đưa ra một tuyên bố như:

db.student.find({}, {roll:1, _id:0})

Tuyên bố trên sẽ chọn tất cả các tài liệu trong bộ sưu tập của sinh viên và tài liệu được trả về sẽ chỉ trả về rolltrường (và loại trừ _id).

Nếu chúng ta không đề cập đến _id:0các lĩnh vực được trả lại sẽ roll_id. Trường '_id' luôn được hiển thị theo mặc định. Vì vậy, chúng ta cần phải đề cập rõ ràng _id:0cùng với roll.


9
Dường như Google không thể như vậy, rất đáng để thử. Bạn có phải loại trừ rõ ràng tất cả các lĩnh vực mà bạn không muốn? Giả sử bạn chỉ muốn một trường nhưng tài liệu có 10 bạn phải đặt 0riêng cho 9 trong số đó? Chỉnh sửa: Nevermind, ngoại trừ _idtức là {field_I_want:1, _id:0}dường như hoạt động
Karl Tryggvason

Có thể thêm một trường và sau đó cập nhật tài liệu nếu tôi sử dụng các phép chiếu không?
chovy

3
Không có câu trả lời nào thực sự đề cập đến những điều sau: Lưu ý: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Điều này có thể thú vị đối với một số bạn. ( nguồn )
user0800

137

lấy tất cả dữ liệu từ bảng

db.student.find({})

CHỌN * TỪ học sinh


lấy tất cả dữ liệu từ bảng mà không cần _id

db.student.find({}, {_id:0})

CHỌN tên, cuộn TỪ học sinh


lấy tất cả dữ liệu từ một trường với _id

db.student.find({}, {roll:1})

CHỌN id, cuộn TỪ học sinh


lấy tất cả dữ liệu từ một trường mà không có _id

db.student.find({}, {roll:1, _id:0})

CHỌN cuộn TỪ học sinh


tìm dữ liệu được chỉ định bằng mệnh đề where

db.student.find({roll: 80})

CHỌN * TỪ học sinh WHERE roll = '80'


tìm dữ liệu bằng mệnh đề where và lớn hơn điều kiện

db.student.find({ "roll": { $gt: 70 }}) // $gt is greater than 

CHỌN * TỪ học sinh cuộn ở đâu> '70'


tìm dữ liệu bằng mệnh đề where và lớn hơn hoặc bằng điều kiện

db.student.find({ "roll": { $gte: 70 }}) // $gte is greater than or equal

CHỌN * TỪ học sinh cuộn WHERE> = '70'


tìm dữ liệu bằng mệnh đề where và nhỏ hơn hoặc bằng điều kiện

db.student.find({ "roll": { $lte: 70 }}) // $lte is less than or equal

CHỌN * TỪ sinh viên cuộn WHERE <= '70'


tìm dữ liệu bằng mệnh đề where và nhỏ hơn điều kiện

db.student.find({ "roll": { $lt: 70 }})  // $lt is less than

CHỌN * TỪ học sinh cuộn ở đâu <'70'



2
Chỉ muốn thêm, vì câu trả lời của bạn đã giúp tôi tìm ra giải pháp của mình, để hiển thị tất cả các thuộc tính ngoại trừ _id sẽ là db.student.find({}, {_id:0})Cảm ơn vì sự giúp đỡ.
dùng8675309

58

Tôi nghĩ mattingly890 có câu trả lời đúng, đây là một ví dụ khác cùng với mẫu / commmand

db.collection.find( {}, {your_key:1, _id:0})

nhập mô tả hình ảnh ở đây


để hiển thị đầu ra từ mongo và những gì nó trả về làm ví dụ.
grepit

Anh bạn đã bỏ phiếu cho tôi vì tôi đã đưa ảnh chụp màn hình vào câu trả lời của tôi?
grepit

Vâng, và cũng bởi vì tôi không thấy câu trả lời của bạn mang lại điều gì mới từ anwer của @therealrootuser
Guillaume Lebreton

10

Ở đây bạn đi, 3 cách làm, ngắn nhất đến nhàm chán:

db.student.find({}, 'roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}).select('roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}, {'roll' : 1 , '_id' : 1 ); // <---- Old lengthy boring way

Để loại bỏ- toán tử sử dụng trường cụ thể :

db.student.find({}).select('roll -_id') // <--- Will remove id from result

1
Tôi nghĩ rằng các lệnh được đề cập của bạn là từ mongoose chứ không phải mongodb ngoại trừ thứ 3.
Ashish

8

Chỉ với mục đích giáo dục, bạn cũng có thể làm điều đó với bất kỳ cách nào sau đây:

1.

    var query = {"roll": {$gt: 70};
    var cursor = db.student.find(query);
    cursor.project({"roll":1, "_id":0});

2.

    var query = {"roll": {$gt: 70};
    var projection = {"roll":1, "_id":0};
    var cursor = db.student.find(query,projection);

`


8

Hãy thử truy vấn sau:

db.student.find({}, {roll: 1, _id: 0}).pretty();

Hi vọng điêu nay co ich!!


beautiful () sẽ chỉ hữu ích khi thực thi thông qua shell chứ không phải từ script.
Dinakar

7

Mặc dù câu trả lời của gowtham đã hoàn tất, điều đáng chú ý là các lệnh đó có thể khác với API khác (đối với những người không sử dụng shell của mongo).
Vui lòng tham khảo liên kết tài liệu để biết thông tin chi tiết.

Nodejs , chẳng hạn, có một phương thức gọi là `chiếu mà bạn sẽ nối vào hàm find của mình để chiếu.

Theo cùng một tập hợp ví dụ, các lệnh như sau có thể được sử dụng với Node:

db.student.find({}).project({roll:1})

CHỌN _id, cuộn TỪ học sinh

Hoặc là
db.student.find({}).project({roll:1, _id: 0})

CHỌN cuộn TỪ học sinh

và như thế.

Một lần nữa, đối với người dùng nodejs, đừng quên (những gì bạn đã quen thuộc nếu bạn đã sử dụng API này trước đây) để sử dụng toArrayđể nối thêm.then lệnh .


6
db.<collection>.find({}, {field1: <value>, field2: <value> ...})

Trong ví dụ của bạn, bạn có thể làm một cái gì đó như:

db.students.find({}, {"roll":true, "_id":false})

Chiếu

Tham số chiếu xác định trường nào được trả về trong tài liệu khớp. Tham số chiếu có một tài liệu có dạng sau:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 hoặc đúng để bao gồm các trường trong các tài liệu trả lại.

  2. 0 hoặc sai để loại trừ trường.

GHI CHÚ

Đối với trường _id, bạn không phải chỉ định rõ ràng _id: 1 để trả về trường _id. Phương thức find () luôn trả về trường _id trừ khi bạn chỉ định _id: 0 để triệt tiêu trường.

ĐỌC THÊM


4

Để hiểu rõ hơn tôi đã viết truy vấn MySQL tương tự.

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {name: true, email: true, phone: true});

MySQL: CHỌN tên, email, điện thoại TỪ tên_bảng;

Selecting specific fields with where clause

MongoDB: db.collection_name.find ({email:'you@email.com '}, {name: true, email: true, phone: true});

MySQL: CHỌN tên, email, điện thoại TỪ tên_bạn WHERE email = 'you@email.com';


3

Điều này làm việc cho tôi,

db.student.find({},{"roll":1})

không có điều kiện trong mệnh đề tức là, bên trong dấu ngoặc nhọn đầu tiên. bên trong dấu ngoặc nhọn tiếp theo: danh sách các tên trường chiếu cần có trong kết quả và 1 cho biết trường cụ thể là một phần của kết quả truy vấn


2

tên của học sinh

student-details = db.students.find({{ "roll": {$gt: 70} },{"name": 1, "_id": False})

nhận được tên và cuộn của học sinh

student-details = db.students.find({{ "roll": {$gt: 70}},{"name": 1,"roll":1,"_id": False})

2

Truy vấn cho MongoDB ở đây phí là bộ sưu tập và mô tả là một trường.

db.getCollection('fees').find({},{description:1,_id:0})

1

Nếu bạn muốn truy xuất trường "cuộn" chỉ cho tất cả 10 bản ghi trong bộ sưu tập. Sau đó thử điều này.

Trong MongoDb:

db.students.find ({}, {"roll": {"$ roll"})

Trong Sql:

chọn cuộn từ học sinh


1

Tôi chỉ muốn thêm vào câu trả lời rằng nếu bạn muốn hiển thị một trường được lồng trong một đối tượng khác, bạn có thể sử dụng cú pháp sau

db.collection.find( {}, {{'object.key': true}})

Ở đây khóa có mặt bên trong đối tượng có tên đối tượng

{ "_id" : ObjectId("5d2ef0702385"), "object" : { "key" : "value" } }

0
db.student.find({}, {"roll":1, "_id":0})

Điều này tương đương với -

Chọn cuộn từ học sinh



db.student.find ({}, {"roll": 1, "tên": 1, "_id": 0})

Điều này tương đương với -

Chọn cuộn, tên từ học sinh


0

Sử dụng Truy vấn như thế này trong trình bao:

1. Sử dụngdatabase_name

e.g: use database_name

2. Chỉ trả về tài sản thông tin trường cụ thể khi khớp, _id:0chỉ định không hiển thị ID trong kết quả

db.collection_name.find( { "Search_Field": "value" }, 
                  { "Field_to_display": 1,_id:0 }  )

0

Trong mongodb 3.4 chúng ta có thể sử dụng logic bên dưới, tôi không chắc về các phiên bản trước

chọn cuộn từ sinh viên ==> db.student.find (! {}, {roll: 1})

logic trên giúp xác định một số cột (nếu chúng ít hơn)


0

Sử dụng Studio 3T cho MongoDB, nếu tôi sử dụng .find({}, { _id: 0, roll: true })nó vẫn trả về một mảng các đối tượng có thuộc _idtính trống .

Sử dụng JavaScript mapđã giúp tôi chỉ truy xuất thuộc tính mong muốn rolldưới dạng một chuỗi chuỗi:

var rolls = db.student
  .find({ roll: { $gt: 70 } }) // query where role > 70
  .map(x => x.roll);           // return an array of role

0

Không chắc điều này trả lời câu hỏi nhưng tôi tin rằng nó đáng được đề cập ở đây. Có một cách nữa để chọn trường đơn (và không phải nhiều) bằng cách sử dụngdb.collection_name.distinct();

ví dụ,db.student.distinct('roll',{});

Hoặc, cách thứ 2: Sử dụng db.collection_name.find().forEach();(nhiều trường có thể được chọn ở đây bằng cách ghép)

ví dụ, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.