Як вибрати єдине поле для всіх документів у колекції MongoDB?


223

У моїй MongoDB у мене є колекція учнів з 10 записами, що мають поля nameта roll. Один запис цієї колекції:

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

Я хочу отримати поле rollлише для всіх 10 записів у колекції, як це робиться у традиційній базі даних, використовуючи:

SELECT roll FROM student

Я переглянув багато блогів, але все призводить до запиту, який повинен містити WHEREпункт, наприклад:

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

Запит еквівалентний:

SELECT * FROM student WHERE roll > 70

Моя вимога - знайти єдиний ключ лише без будь-яких умов. Отже, в чому полягає операція запиту.


@NeilLunn Дякуємо за посилання SQL на картографування MongoDB . Не знаю, як я пропустив це.
Shipra Swati

Відповіді:


255

З документів MongoDB :

Проекція може явно включати кілька полів. У наступній операції метод find () повертає всі документи, які відповідають запиту. У наборі результатів у відповідні документи повертаються лише поля item та qty та, за замовчуванням, поле _id.

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

У цьому прикладі від людей в Монго, які повертаються документи будуть містити тільки поля item, qtyі _id.


Таким чином, ви маєте змогу оформити заяву на зразок:

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

Вищевказане твердження дозволить вибрати всі документи у колекції учнів, а повернутий документ поверне лише rollполе (та виключить _id).

Якщо ми не згадаємо, _id:0повернені поля будуть rollі _id. Поле "_id" завжди відображається за замовчуванням. Тому нам потрібно чітко згадати _id:0разом із roll.


9
Не можу здатися Google цим, тому варто зняти. Чи потрібно явно виключити всі поля, які ви не хочете? Скажіть, ви хочете лише одне поле, але в документі є 10, ви повинні експліцитно встановити 0для 9 з них? Edit: Nevermind, за винятком _idтобто , {field_I_want:1, _id:0}здається, працює
Karl Трюггвасона

Чи можна додати поле, а потім оновити документ, якщо я використовую проекції?
chovy

3
Жодна з відповідей насправді не згадує наступне: Примітка. With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Це може бути цікавим для деяких із вас. ( джерело )
користувач0800

137

отримати всі дані з табл

db.student.find({})

ВИБІР * ВІД студента


отримати всі дані з таблиці без _id

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

ВИБІРТЕ ім'я, відкачати від студента


отримати всі дані з одного поля за допомогою _id

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

ВИБІРІТЬ ідентифікатор, відкачати від студента


отримати всі дані з одного поля без _id

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

ВИБІРИТЕ рулон від студента


знайти вказані дані, використовуючи пункт де

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

ВИБІРТЕ * ВІД студентів, де рулон = '80'


знайти дані, використовуючи де пункт та більший за умову

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

ВИБІРТЕ * ВІД студента, де рулон> '70'


знайти дані, використовуючи де пункт та більший за або умова

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

ВИБІР * ВІД студента, де рулон> = '70'


знайти дані, використовуючи де пункт та менше або дорівнює умові

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

ВИБІРТЕ * ВІД студента, де рулон <= '70'


знайти дані, використовуючи де пункт та менше ніж умову

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

ВИБІРТЕ * ВІД студента, ЩО ролик <'70'



2
Просто хотів додати, оскільки ваша відповідь допомогла мені розібратися з моїм рішенням, відобразити всі властивості, крім _id, буде вдячна db.student.find({}, {_id:0})за допомогу.
user8675309

58

Я думаю, що mattingly890 має правильну відповідь, ось ще один приклад разом із шаблоном / командою

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

введіть тут опис зображення


показати вихід з mongo і те, що він повертає як приклад.
grepit

Чувак, ти мені відмовився, бо я включив скріншот у свою відповідь?
grepit

Так, і тому, що я не бачу, що ваша відповідь приносить нове з антвер @therealrootuser '
Гійом

10

Ось, три способи робити, найкоротше - нудно:

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

Для видалення конкретного -оператора використання поля :

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

1
Я думаю, що згадані вами команди походять з мангуста, а не з mongodb, крім третьої.
Ашиш

8

Лише для освітніх цілей ви також можете це зробити будь-яким із наступних способів:

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

Спробуйте виконати наступний запит:

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

Сподіваюся, це допомагає !!


pretty () стане в нагоді лише при виконанні через оболонку, а не зі скриптів.
Дінакар

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

У вашому прикладі ви можете зробити щось на кшталт:

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

Проекція

Параметр проекції визначає, які поля повертаються у відповідних документах. Параметр проекції приймає документ такої форми:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 або true, щоб включити поле до повернення документів.

  2. 0 або false, щоб виключити поле.

ПРИМІТКА

Для поля _id вам не потрібно чітко вказувати _id: 1, щоб повернути поле _id. Метод find () завжди повертає поле _id, якщо ви не вказали _id: 0 для придушення поля.

ЧИТАЙТЕ БІЛЬШЕ


7

Хоча відповідь gowtham завершена, варто зазначити, що ці команди можуть відрізнятися від API на інші (для тих, хто не використовує оболонку монго).
Для отримання детальної інформації перейдіть до посилання на документацію .

Наприклад , у Nodejs є метод під назвою `проекція, яку ви додали б до своєї функції пошуку для проектування.

Дотримуючись того ж набору прикладів, такі команди, як наведені нижче, можна використовувати з Node:

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

ВИБІРТЕ _id, відкоти від студента

Або
db.student.find({}).project({roll:1, _id: 0})

ВИБІРИТЕ рулон від студента

і так далі.

Знову ж таки для користувачів nodejs, не забувайте (про що ви вже повинні бути знайомі, якщо раніше використовували цей API) toArray, щоб додати свою .thenкоманду.


4

Для кращого розуміння я написав подібний запит MySQL.

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {ім'я: вірно, електронна пошта: правда, телефон: правда});

MySQL: ВИБІРТЕ ім'я, електронна пошта, телефон ІМЯ таблиці_назви;

Selecting specific fields with where clause

MongoDB: db.collection_name.find ({email:'you@email.com '}, {ім'я: вірно, електронна пошта: правда, телефон: правда});

MySQL: ВИБІРТЕ ім’я, електронна пошта, телефон ІМЯ таблиці_ДОГО ДЕРЖАВИ = 'you@email.com';


3

Це працює для мене,

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

немає умови, де пункт, тобто, всередині перших фігурних дужок. всередині наступних фігурних дужок: список імен полів проекцій, необхідних для отримання результату, а 1 вказує, що конкретне поле є частиною результату запиту


2

отримання імені студента

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

отримання імені та рулону студента

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


1

Якщо ви хочете отримати поле "roll" лише для всіх 10 записів у колекціях. Потім спробуйте це.

У MongoDb:

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

У Sql:

виберіть рулон у студентів


1

Я просто хочу додати до відповідей, що якщо ви хочете відобразити поле, яке вкладено в інший об’єкт, ви можете використовувати наступний синтаксис

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

Тут ключ присутній всередині об'єкта з ім'ям

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

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

Це еквівалентно -

Виберіть ролик від студента



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

Це еквівалентно -

Виберіть рулон, ім'я від студента


0

Використовуйте такий запит у оболонці:

1. Використовуйтеdatabase_name

e.g: use database_name

2. Який повертає лише активні дані конкретної поля при зіставленні, _id:0вказує не відображати ідентифікатор в результаті

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

0

У mongodb 3.4 ми можемо використовувати нижче логіку, я не впевнений у попередніх версіях

вибрати рулон від студента ==> db.student.find (! {}, {roll: 1})

наведена вище логіка допомагає визначити деякі стовпці (якщо їх менше)


0

Використовуючи Studio 3T для MongoDB, якщо я .find({}, { _id: 0, roll: true })його використовую, все одно повертаю масив об'єктів з порожнім _idвластивістю.

Використання JavaScript mapдопомогло мені отримати лише потрібне rollвластивість у вигляді масиву рядків:

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

0

Не впевнений, що це відповідає на питання, але я вважаю, що тут варто згадати. Є ще один спосіб вибору одного поля (а не декількох) за допомогоюdb.collection_name.distinct();

наприклад,db.student.distinct('roll',{});

Або другий спосіб: Використання db.collection_name.find().forEach();(тут можна обрати кілька полів конкатенацією)

наприклад, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.