Jak wybrać jedno pole dla wszystkich dokumentów w kolekcji MongoDB?


223

W moim MongoDB mam kolekcję studentów z 10 rekordami zawierającymi pola namei roll. Jeden rekord tej kolekcji to:

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

Chcę pobrać pole rolltylko dla wszystkich 10 rekordów w kolekcji, tak jak w tradycyjnej bazie danych za pomocą:

SELECT roll FROM student

Przeglądałem wiele blogów, ale wszystkie powodują zapytanie, które musi zawierać WHEREklauzulę, na przykład:

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

Zapytanie jest równoważne z:

SELECT * FROM student WHERE roll > 70

Moim wymaganiem jest znalezienie tylko jednego klucza bez żadnych warunków. Więc jaka jest w tym celu operacja zapytania.


@NeilLunn Dziękujemy za połączenie SQL z mapowaniem MongoDB . Nie wiem jak mi tego brakowało.
Shipra Swati,

Odpowiedzi:


255

Z dokumentów MongoDB :

Projekcja może wyraźnie obejmować kilka pól. W poniższej operacji metoda find () zwraca wszystkie dokumenty pasujące do zapytania. W zestawie wyników zwracane są tylko pola item i qty oraz domyślnie pole _id w pasujących dokumentach.

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

W tym przykładzie od ludzi na Mongo, powracające dokumenty będą zawierać tylko te pola item, qty, i _id.


Dlatego powinieneś być w stanie wydać oświadczenie, takie jak:

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

Powyższe oświadczenie spowoduje zaznaczenie wszystkich dokumentów w kolekcji studentów, a zwrócony dokument zwróci tylko rollpole (z wyłączeniem _id).

Jeśli nie wspomnimy, _id:0zwrócone pola to rolli _id. Pole „_id” jest zawsze wyświetlane domyślnie. Dlatego musimy wyraźnie wspomnieć _id:0także roll.


9
Nie wydaje się to Google, więc warto spróbować. Czy musisz wyraźnie wykluczyć wszystkie pola, których nie chcesz? Czy chcesz mieć tylko jedno pole, ale dokument ma 10, które musisz jawnie ustawić 0dla 9 z nich? Edycja: Nevermind, z wyłączeniem _idie {field_I_want:1, _id:0}wydaje się działać
Karl Tryggvason

Czy można dodać pole, a następnie zaktualizować dokument, jeśli korzystam z projekcji?
chovy,

3
Żadna z odpowiedzi nie wspomina o następujących kwestiach: Uwaga: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Może to być interesujące dla niektórych z was. ( źródło )
user0800

137

pobierz wszystkie dane z tabeli

db.student.find({})

WYBIERZ * OD studenta


pobierz wszystkie dane z tabeli bez _id

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

WYBIERZ nazwisko, rzuć od studenta


pobierz wszystkie dane z jednego pola za pomocą _id

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

WYBIERZ identyfikator, rzuć od studenta


pobierz wszystkie dane z jednego pola bez _id

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

WYBIERZ rzut od studenta


znajdź określone dane za pomocą klauzuli where

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

WYBIERZ * OD studentów, GDZIE roll = „80”


znajdź dane, używając klauzuli where i większej niż warunek

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

WYBIERZ * OD studenta, GDZIE rzuć> 70


znajdź dane, używając klauzuli where i większej lub równej warunkowi

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

WYBIERZ * OD studenta GDZIE rzuć> = „70”


znajdź dane, używając klauzuli where i mniejszej lub równej warunkowi

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

WYBIERZ * OD studenta GDZIE rzuć <= '70'


znajdź dane, używając klauzuli where i mniej niż warunek

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

WYBIERZ * OD studenta GDZIE rzuć <70



2
Chciałem tylko dodać, ponieważ twoja odpowiedź pomogła mi wymyślić moje rozwiązanie, aby wyświetlić wszystkie właściwości oprócz _id byłby db.student.find({}, {_id:0})Dzięki za pomoc.
user8675309

58

Myślę, że mattingly890 ma poprawną odpowiedź, oto kolejny przykład wraz ze wzorcem / poleceniem

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

wprowadź opis zdjęcia tutaj


aby pokazać wynik z mongo i co zwraca jako przykład.
grepit

Koleś, oddałeś mi głos, ponieważ w odpowiedzi umieściłem zrzut ekranu?
grepit

Tak, a także dlatego, że nie widzę, co twoja odpowiedź przynosi nowe z odpowiedzi @therealrootuser
Guillaume Lebreton

10

Proszę bardzo, 3 sposoby działania, najkrótsze do nudnego:

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

Aby usunąć określone pole, użyj -operatora:

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

1
Myślę, że twoje wspomniane polecenia pochodzą z mangusty, a nie z mongodb, z wyjątkiem trzeciego.
Ashish

8

Tylko w celach edukacyjnych możesz to zrobić na jeden z poniższych sposobów:

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

Wypróbuj następujące zapytanie:

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

Mam nadzieję że to pomoże!!


pretty () przyda się tylko podczas wykonywania powłoki, a nie ze skryptów.
Dinakar,

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

W twoim przykładzie możesz zrobić coś takiego:

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

Występ

Parametr rzutowania określa, które pola są zwracane w pasujących dokumentach. Parametr projekcji przyjmuje dokument o następującej formie:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 lub true, aby dołączyć pole do dokumentów zwrotnych.

  2. 0 lub fałsz, aby wykluczyć pole.

UWAGA

W polu _id nie trzeba jawnie określać _id: 1, aby zwrócić pole _id. Metoda find () zawsze zwraca pole _id, chyba że podasz _id: 0 w celu pominięcia pola.

CZYTAJ WIĘCEJ


7

Chociaż odpowiedź gowtham jest kompletna, warto zauważyć, że te polecenia mogą różnić się w zależności od interfejsu API (w przypadku tych, którzy nie używają powłoki Mongo).
Proszę zapoznać się z linkiem do dokumentacji .

Nodejs przykład ma metodę o nazwie `projection, którą dołączasz do funkcji find w celu wyświetlania.

Zgodnie z tym samym zestawem przykładów w węźle można używać następujących poleceń:

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

WYBIERZ _id, rzuć od studenta

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

WYBIERZ rzut od studenta

i tak dalej.

Ponownie dla użytkowników nodejs, nie zapomnij (co powinieneś już znać, jeśli wcześniej używałeś tego API), aby użyć toArrayw celu dołączenia .thenpolecenia.


4

Dla lepszego zrozumienia napisałem podobne zapytanie MySQL.

Selecting specific fields 

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

MySQL: WYBIERZ nazwę, adres e-mail, telefon Z nazwa_tabeli;

Selecting specific fields with where clause

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

MySQL: WYBIERZ nazwę, adres e-mail, telefon Z nazwy_tabeli GDZIE email = „ty@email.com”;


3

To działa dla mnie

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

brak warunku w klauzuli where, tj. wewnątrz pierwszych nawiasów klamrowych. wewnątrz kolejnych nawiasów klamrowych: lista nazw pól projekcji, które będą potrzebne w wyniku, a 1 oznacza, że ​​dane pole jest częścią wyniku zapytania


2

uzyskanie imienia studenta

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

uzyskanie imienia i nazwiska studenta

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

2

Zapytanie dla MongoDB tutaj opłaty jest kolekcja, a opis jest polem.

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

1

Jeśli chcesz pobrać pole „roll” tylko dla wszystkich 10 rekordów w kolekcjach. Następnie spróbuj tego.

W MongoDb:

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

W Sql:

wybierz rzut od studentów


1

Chcę tylko dodać do odpowiedzi, że jeśli chcesz wyświetlić pole zagnieżdżone w innym obiekcie, możesz użyć następującej składni

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

Tutaj klucz jest obecny w obiekcie o nazwie obiekt

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

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

Jest to równoważne z -

Wybierz rzut od studenta



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

Jest to równoważne z -

Wybierz rzut, nazwisko od ucznia


0

Użyj tego zapytania w powłoce:

1. Użyjdatabase_name

e.g: use database_name

2. Który zwraca dopasowane informacje o zasobach tylko o określonych polach, _id:0określa, aby nie wyświetlać identyfikatora w wyniku

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

0

W mongodb 3.4 możemy użyć poniższej logiki, nie jestem pewien co do poprzednich wersji

wybierz rzut od studenta ==> db.student.find (! {}, {roll: 1})

powyższa logika pomaga zdefiniować niektóre kolumny (jeśli są mniejsze)


0

Używając Studio 3T dla MongoDB, jeśli .find({}, { _id: 0, roll: true })go użyję, nadal zwróci tablicę obiektów z pustym_id właściwością.

Korzystanie z JavaScript mappomogło mi pobrać tylko pożądaną rollwłaściwość jako tablicę ciągów znaków:

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

0

Nie jestem pewien, czy to odpowiada na pytanie, ale uważam, że warto tutaj wspomnieć. Jest jeszcze jeden sposób wyboru pojedynczego pola (a nie wielu) za pomocądb.collection_name.distinct();

na przykład,db.student.distinct('roll',{});

Lub drugi sposób: za pomocą db.collection_name.find().forEach(); (można tu wybrać wiele pól poprzez konkatenację)

na przykład, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.