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.