MongoDB koleksiyonundaki tüm belgeler için tek bir alan nasıl seçilir?


223

Benim MongoDB, ben 10 kayıtları alanları sahip bir öğrenci koleksiyonu var nameve roll. Bu koleksiyonun bir kaydı:

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

Alanı kullanarak rollyalnızca geleneksel veritabanında yaptığımız gibi koleksiyondaki tüm 10 kayıt için alanı almak istiyorum :

SELECT roll FROM student

Birçok blog üzerinden geçtim ama hepsi, içinde WHEREmadde olması gereken bir sorgu ile sonuçlanır , örneğin:

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

Sorgu şuna eşdeğerdir:

SELECT * FROM student WHERE roll > 70

Benim gereksinimim sadece herhangi bir koşul olmadan tek bir anahtar bulmak. Peki, bunun için sorgulama işlemi nedir.


@NeilLunn MongoDB Eşleme SQL bağlantısı için teşekkürler . Bunu nasıl özlediğimi bilmiyorum.
— Shipra Swati

Yanıtlar:


255

Gönderen MongoDB docs :

Bir projeksiyon açıkça birkaç alan içerebilir. Aşağıdaki işlemde find () yöntemi sorguyla eşleşen tüm belgeleri döndürür. Sonuç kümesinde, yalnızca öğe ve adet alanları ve varsayılan olarak _id alanı eşleşen belgelerde geri döner.

db.inventory.find ({type: 'food'}, {madde: 1, adet: 1})

Mongo de millet bu örnekte, dönen belgeler sadece alanlarını içerecektir item, qtyve _id.


Böylece, aşağıdaki gibi bir ifade verebilmelisiniz:

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

Yukarıdaki ifade, öğrenci koleksiyonundaki tüm belgeleri seçer ve döndürülen belge yalnızca rollalanı döndürür (ve hariç tutar _id).

Eğer bahsetmezsek _id:0dönen alanlar rollve olacaktır _id. '_İd' alanı her zaman varsayılan olarak görüntülenir. Biz açıkça belirtmek gerekir Yani _id:0birlikte roll.


9
Google'a bu görünmüyor, bu yüzden denemeye değer. İstemediğiniz tüm alanları açıkça hariç tutmak zorunda mısınız? Diyelim ki yalnızca bir alan istiyorsunuz ama belgede 09 tanesi için açıkça ayarlamanız gereken 10 tane var mı? Edit: Nevermind, hariç _idyani çalışıyor {field_I_want:1, _id:0}gibi görünüyor
— Karl Tryggvason

Projeksiyonlar kullanırsam bir alan ekleyip dokümanı güncellemek mümkün mü?
— chovy

3
Cevapların hiçbiri aslında aşağıdakilerden bahsetmez: Not: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Bu, bazılarınız için ilginç olabilir. ( kaynak )
— user0800

137

tüm verileri tablodan al

db.student.find({})

Öğrenciden SELECT *


_id olmadan tablodan tüm verileri al

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

Adı seç, öğrenciden rulo


_id ile bir alandaki tüm verileri alın

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

Kimlik seç, öğrenciden rulo


_id olmadan bir alandaki tüm verileri alın

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

Öğrenciden SELECT roll


where yan tümcesini kullanarak belirtilen verileri bulma

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

SEÇİN * Öğrencilerden NEREDE = '80'


where yantümcesinden ve koşuldan büyük bir veri kullanarak bir veri bulma

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

SEÇ * öğrenciden YERDE> '70'


koşullu ve koşuldan büyük veya ona eşit olan durumlarda kullanarak veri bulma

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

SEÇ * öğrenciden YERDE => '70'


where yan tümcesini kullanarak ve koşula eşit veya koşuldan küçük bir veri bulma

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

SEÇ * öğrenci NEREDEN rulo <= '70'


koşullu ve koşullu olmayan durumları kullanarak bir veri bulma

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

SEÇİN * Öğrenciden YER <'70'



2
Sadece eklemek istedim, çünkü cevabınız çözümümü anlamama yardımcı oldu, _id dışındaki tüm özellikleri görüntülemek için db.student.find({}, {_id:0})Yardımınız için teşekkürler.
— user8675309

58

Mattingly890'ın doğru cevaba sahip olduğunu düşünüyorum, burada desen / commmand ile birlikte başka bir örnek var

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

resim açıklamasını buraya girin


mongodan elde edilen çıktıyı ve örnek olarak ne döndürdüğünü göstermek için
— grepit

Dostum, cevabıma ekran görüntüsü eklediğim için bana aşağı oy verdin mi?
— grepit

Evet, ayrıca cevabınızın @therealrootuser'ın anwer'sından ne getirdiğini göremediğim için
— Guillaume Lebreton

10

Buyrun, 3 yapmanın yolu, Sıkıcıdan en kısa :

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

To kaldırmak belirli alan kullanımı -operatörü:

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

1
Sanırım bahsettiğiniz komutlar, 3. sırada olanlar dışında mongood değil de mongoose'dan geliyor.
— Ashish

8

Sadece eğitim amaçlı olarak aşağıdaki yollardan biriyle de yapabilirsiniz:

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

Aşağıdaki sorguyu deneyin:

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

Bu yardımcı olur umarım!!


pretty () yalnızca kabuktan yürütülürken yararlı olur, komut dosyalarından değil.
— Dinakar

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

Örneğinizde aşağıdakine benzer bir şey yapabilirsiniz:

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

Projeksiyon

Yansıtma parametresi, eşleşen belgelerde hangi alanların döndürüleceğini belirler. Projeksiyon parametresi aşağıdaki formun bir belgesini alır:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 veya true değerini alana iade belgelerine eklemek için.

  2. 0 veya alanı hariç tutmak için false.

NOT

_İd alanı için, _id alanını döndürmek üzere _id: 1 öğesini açıkça belirtmeniz gerekmez. Find () yöntemi, alanı bastırmak için _id: 0 belirtmediğiniz sürece her zaman _id alanını döndürür.

DAHA FAZLA OKU


7

İken Gowtham cevabı tamamlandıktan, bu o komutları (Mongo'nın kabuk kullanmayan kişiler için) başka API üzerinde farklı olabilir dikkati çekiyor. Ayrıntılı bilgi için
lütfen dokümantasyon bağlantısına bakınız .

Örneğin Nodejs , projeksiyon yapmak için bulma işlevinize ekleyeceğiniz projeksiyon adı verilen bir yönteme sahiptir.

Aynı örnek kümesini izleyerek, Düğüm ile aşağıdakine benzer komutlar kullanılabilir:

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

_ID seçimini yapın, FROM öğrenci

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

Öğrenciden SELECT roll

ve bunun gibi.

Yine nodejs kullanıcıları için, komutunuzu toArrayeklemek için kullanmayı unutmayın (daha önce bu API'yı kullandıysanız neleri bilmeniz gerekir) .then.


4

Daha iyi anlamak için benzer MySQL sorgusu yazdım.

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {name: true, e-posta: true, telefon: true});

MySQL: tablo_adı FROM adı, e-posta, telefon;

Selecting specific fields with where clause

MongoDB: db.collection_name.find ({email:'you@email.com '}, {ad: true, e-posta: true, telefon: true});

MySQL: tablo_adı dan isim, e-posta, telefon WHERE email = 'you@email.com';


3

Bu benim için çalışıyor,

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

hiçbir koşul, yani ilk kıvırcık parantez içinde hiçbir koşul. sonraki küme parantezleri içinde: sonuçta ihtiyaç duyulan projeksiyon alanı adlarının listesi ve 1, belirli alanın sorgu sonucunun bir parçası olduğunu gösterir


2

öğrencinin adını almak

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

öğrencinin adını ve ismini almak

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

2

Burada MongoDB ücretleri için sorgu toplama ve açıklama bir alandır.

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

1

U alan "rulo" almak istiyorsanız sadece koleksiyon 10 kayıtların tümü için. O zaman bunu deneyin.

MongoDb'de:

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

Sql içinde:

öğrencilerden rulo seç


1

Sadece başka bir nesnede yuvalanmış bir alanı görüntülemek istiyorsanız, aşağıdaki sözdizimini kullanabileceğiniz cevaplara eklemek istiyorum.

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

Burada anahtar object adlı nesnenin içinde bulunur

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

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

Bu -

Öğrenciden rulo seçin



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

Bu -

Rulo, öğrenciden isim seçin


0

Sorgu kabuğunda şöyle kullanın:

1. Kullanımdatabase_name

e.g: use database_name

2. Eşleştirildiğinde yalnızca varlıklara özel alan bilgilerini döndüren _id:0sonuçta kimliğin gösterilmeyeceğini belirtir

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

0

Mongodb 3.4'te aşağıdaki mantığı kullanabiliriz, önceki sürümlerden emin değilim

öğrenci ==> db.student.find (! {}, {roll: 1})

yukarıdaki mantık bazı sütunları tanımlamaya yardımcı olur (daha küçükse)


0

MongoDB için Studio 3T kullanarak, .find({}, { _id: 0, roll: true })yine de ben boş bir _idözelliği olan bir dizi nesne döndürür .

JavaScript kullanmak map, istenen rollözelliği yalnızca bir dize dizisi olarak almama yardımcı oldu :

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

0

Bunun soruyu cevapladığından emin değilim ama burada bahsetmeye değer. Kullanarak tek alan (birden çok değil) seçmenin bir yolu daha vardb.collection_name.distinct();

Örneğin,db.student.distinct('roll',{});

Veya 2. yol: Kullanarak db.collection_name.find().forEach();(burada birleştirme ile birden fazla alan seçilebilir)

Örneğin, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.