Bagaimana cara memilih satu bidang untuk semua dokumen dalam koleksi MongoDB?


223

Dalam MongoDB saya, saya memiliki koleksi siswa dengan 10 catatan memiliki bidang namedan roll. Salah satu catatan dari koleksi ini adalah:

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

Saya ingin mengambil bidang rollhanya untuk semua 10 catatan dalam koleksi seperti yang akan kami lakukan dalam database tradisional dengan menggunakan:

SELECT roll FROM student

Saya telah menelusuri banyak blog tetapi semuanya menghasilkan kueri yang harus memiliki WHEREklausul di dalamnya, misalnya:

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

Kueri setara dengan:

SELECT * FROM student WHERE roll > 70

Persyaratan saya adalah menemukan satu kunci saja tanpa syarat apa pun. Jadi, apa operasi permintaan untuk itu.


@NeilLunn Terima kasih atas tautan Pemetaan SQL ke MongoDB . Tidak tahu bagaimana saya melewatkan ini.
Shipra Swati

Jawaban:


255

Dari dokumen MongoDB :

Proyeksi dapat secara eksplisit menyertakan beberapa bidang. Dalam operasi berikut, metode find () mengembalikan semua dokumen yang cocok dengan kueri. Di set hasil, hanya bidang item dan qty dan, secara default, bidang _id kembali dalam dokumen yang cocok.

db.inventory.find ({type: 'food'}, {item: 1, qty: 1})

Dalam contoh ini dari orang-orang di Mongo, dokumen kembali hanya akan berisi bidang item, qtydan _id.


Dengan demikian, Anda harus dapat mengeluarkan pernyataan seperti:

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

Pernyataan di atas akan memilih semua dokumen dalam koleksi siswa, dan dokumen yang dikembalikan hanya akan mengembalikan rollbidang (dan mengecualikan _id).

Jika kami tidak menyebutkan _id:0bidang yang dikembalikan akan rolldan _id. Kolom '_id' selalu ditampilkan secara default. Jadi kita perlu menyebutkan secara eksplisit _id:0bersama roll.


9
Bagi Google ini tidak terlihat, sangat layak dicoba. Apakah Anda harus secara eksplisit mengecualikan semua bidang yang tidak Anda inginkan? Katakanlah Anda hanya menginginkan satu bidang tetapi dokumen memiliki 10 bidang yang harus Anda tetapkan secara eksplisit 0untuk 9 bidang tersebut? Sunting: Nevermind, kecuali _idie {field_I_want:1, _id:0}sepertinya berfungsi
Karl Tryggvason

Apakah mungkin untuk menambahkan bidang dan kemudian memperbarui dokumen jika saya menggunakan proyeksi?
chovy

3
Tak satu pun dari jawaban yang benar-benar menyebutkan sebagai berikut: Catatan: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Ini mungkin menarik bagi sebagian dari Anda. ( sumber )
user0800

137

dapatkan semua data dari tabel

db.student.find({})

PILIH * DARI siswa


dapatkan semua data dari tabel tanpa _id

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

SELECT name, roll DARI siswa


dapatkan semua data dari satu bidang dengan _id

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

PILIH id, gulung DARI siswa


dapatkan semua data dari satu bidang tanpa _id

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

SELECT roll DARI siswa


menemukan data yang ditentukan menggunakan klausa mana

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

PILIH * DARI siswa DI MANA roll = '80'


menemukan data menggunakan klausa mana dan lebih besar dari kondisi

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

PILIH * DARI siswa DI MANA roll> '70'


menemukan data menggunakan klausa mana dan lebih besar atau sama dengan kondisi

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

PILIH * DARI siswa DI MANA roll> = '70'


menemukan data menggunakan klausa mana dan kurang dari atau sama dengan kondisi

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

PILIH * DARI siswa DI MANA roll <= '70'


menemukan data menggunakan klausa mana dan kurang dari kondisi

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

PILIH * DARI siswa DI MANA roll <'70 '



2
Hanya ingin menambahkan, karena jawaban Anda membantu saya mengetahui solusi saya, untuk menampilkan semua properti kecuali _id akan db.student.find({}, {_id:0})Terima kasih atas bantuannya.
user8675309

58

Saya pikir mattingly890 memiliki jawaban yang benar, berikut adalah contoh lain bersama dengan pola / perintah

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

masukkan deskripsi gambar di sini


untuk menampilkan output dari mongo dan apa yang dikembalikan sebagai contoh.
grepit

Bung apakah Anda memberi saya suara turun karena saya telah menyertakan tangkapan layar dalam jawaban saya?
grepit

Ya, dan juga karena saya tidak melihat apa jawaban Anda dari jawaban baru @therealrootuser
Guillaume Lebreton

10

Ini dia, 3 cara melakukan, Terpendek untuk membosankan:

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

Untuk menghapus- operator bidang gunakan tertentu :

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

1
Saya pikir perintah yang Anda sebutkan berasal dari luwak dan bukan luwak kecuali yang ke-3.
Ashish

8

Hanya untuk tujuan pendidikan Anda juga bisa melakukannya dengan salah satu cara berikut:

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

Coba kueri berikut:

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

Semoga ini membantu!!


pretty () hanya akan berguna saat mengeksekusi melalui shell, bukan dari skrip.
Dinakar

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

Dalam contoh Anda, Anda dapat melakukan sesuatu seperti:

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

Proyeksi

Parameter proyeksi menentukan bidang mana yang dikembalikan dalam dokumen yang cocok. Parameter proyeksi mengambil dokumen dalam bentuk berikut:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 atau benar untuk memasukkan bidang dalam dokumen pengembalian.

  2. 0 atau salah untuk mengecualikan bidang.

CATATAN

Untuk bidang _id, Anda tidak perlu menentukan _id: 1 untuk mengembalikan bidang _id secara eksplisit. Metode find () selalu mengembalikan bidang _id kecuali jika Anda menentukan _id: 0 untuk menekan bidang.

BACA LEBIH LAJUT


7

Sementara jawaban gowtham selesai, perlu dicatat bahwa perintah-perintah itu mungkin berbeda dari pada API ke yang lain (bagi mereka yang tidak menggunakan shell mongo).
Silakan merujuk ke tautan dokumentasi untuk info terperinci.

Nodejs , misalnya, memiliki metode yang disebut `proyeksi yang akan Anda tambahkan ke fungsi find Anda untuk diproyeksikan.

Mengikuti set contoh yang sama, perintah seperti berikut dapat digunakan dengan Node:

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

SELECT _id, roll DARI siswa

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

SELECT roll DARI siswa

dan seterusnya.

Sekali lagi untuk pengguna nodejs, jangan lupa (apa yang harus Anda ketahui jika Anda menggunakan API ini sebelumnya) untuk digunakan toArrayuntuk menambahkan .thenperintah Anda .


4

Untuk pemahaman yang lebih baik saya telah menulis permintaan MySQL yang serupa.

Selecting specific fields 

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

MySQL: SELECT name, email, phone FROM table_name;

Selecting specific fields with where clause

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

MySQL: SELECT name, email, phone FROM table_name WHERE email = 'you@email.com';


3

Ini bekerja untuk saya,

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

tidak ada kondisi di mana klausa yaitu, di dalam kurung kurawal pertama. di dalam kurung kurawal berikutnya: daftar nama bidang proyeksi yang akan dibutuhkan dalam hasil dan 1 menunjukkan bidang tertentu adalah bagian dari hasil kueri


2

mendapatkan nama siswa

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

mendapatkan nama & daftar siswa

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

2

Kueri untuk MongoDB di sini biayanya adalah pengumpulan dan deskripsi adalah bidang.

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

1

Jika Anda ingin mengambil "gulungan" bidang hanya untuk semua 10 catatan dalam koleksi. Lalu coba ini.

Dalam MongoDb:

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

Dalam Sql:

pilih roll dari siswa


1

Saya hanya ingin menambahkan jawaban bahwa jika Anda ingin menampilkan bidang yang bersarang di objek lain, Anda dapat menggunakan sintaks berikut

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

Di sini kunci ada di dalam objek bernama objek

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

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

Ini setara dengan -

Pilih daftar siswa



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

Ini setara dengan -

Pilih roll, nama dari siswa


0

Gunakan Query seperti ini di shell:

1. Gunakandatabase_name

e.g: use database_name

2. Yang mengembalikan hanya aset informasi bidang tertentu saat cocok, _id:0menentukan untuk tidak menampilkan ID dalam hasil

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

0

Dalam mongodb 3.4 kita dapat menggunakan logika di bawah ini, saya tidak yakin tentang versi sebelumnya

pilih roll dari student ==> db.student.find (! {}, {roll: 1})

logika di atas membantu mendefinisikan beberapa kolom (jika kurang)


0

Menggunakan Studio 3T untuk MongoDB, jika saya menggunakannya .find({}, { _id: 0, roll: true })masih mengembalikan array objek dengan _idproperti kosong .

Menggunakan JavaScript mapmembantu saya untuk hanya mengambil rollproperti yang diinginkan sebagai array string:

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

0

Tidak yakin ini menjawab pertanyaan, tetapi saya yakin ada baiknya disebutkan di sini. Ada satu cara lagi untuk memilih bidang tunggal (dan bukan multipel) menggunakandb.collection_name.distinct();

misalnya,db.student.distinct('roll',{});

Atau, cara ke-2: Menggunakan db.collection_name.find().forEach();(beberapa bidang dapat dipilih di sini dengan gabungan)

misalnya, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.