Как выбрать одно поле для всех документов в коллекции MongoDB?


224

В моем 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 Mapping . Не знаю, как я это пропустил.
Шипра Свати

Ответы:


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 из них? Изменить: Неважно, исключая _idто есть, {field_I_want:1, _id:0}кажется, работает
Карл Tryggvason

Можно ли добавить поле, а затем обновить документ, если я использую проекции?
Чови

3
Ни один из ответов на самом деле не упоминает следующее: Примечание: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.это может быть интересно для некоторых из вас. ( источник )
user0800

138

получить все данные из таблицы

db.student.find({})

ВЫБРАТЬ * ОТ студента


получить все данные из таблицы без _id

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

ВЫБЕРИТЕ имя, катитесь ОТ студента


получить все данные из одного поля с помощью _id

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

ВЫБЕРИТЕ идентификатор, катитесь ОТ студента


получить все данные из одного поля без _id

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

ВЫБРАТЬ ролл от студента


найти указанные данные, используя предложение where

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

ВЫБЕРИТЕ * ОТ ШКОЛЬНИКОВ, ГДЕ рулон = '80'


найти данные, используя условие where и значение больше, чем условие

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

ВЫБЕРИТЕ * ОТ студента, ГДЕ катите> 70


найти данные, используя условие where и больше или равно условию

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

ВЫБЕРИТЕ * ОТ ШКОЛЬНИКА, куда катитесь> = '70'


найти данные, используя условие where и меньше или равно условию

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

ВЫБЕРИТЕ * ОТ ШКОЛЬНИКА, КУДА катится <= '70'


найти данные, используя условие where и меньше, чем условие

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

ВЫБЕРИТЕ * ОТ ШКОЛЬНИКА, куда катитесь <'70'



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

58

Я думаю, что mattingly890 имеет правильный ответ, вот еще один пример вместе с pattern / commmand

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

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


чтобы показать выход из Монго и что он возвращает в качестве примера.
grepit

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

Да, а также потому, что я не вижу, что ваш ответ приносит новое из ответа @therealrootuser
Гийома Лебретона,

11

Вот, пожалуйста, 3 способа сделать, от кратчайшего до скучного:

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
Я думаю, что ваши упомянутые команды от mongoose, а не от mongodb, кроме 3-го.
Ашиш

9

Просто для образовательных целей вы также можете сделать это одним из следующих способов:

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

Хотя ответ Гаутама завершен, стоит отметить, что эти команды могут отличаться от API к другому (для тех, кто не использует оболочку mongo).
Пожалуйста, обратитесь к документации ссылку для получения подробной информации.

Nodejs , у есть метод, называемый projection, который вы добавляете в свою функцию find для проецирования.

Следуя тому же набору примеров, команды, подобные приведенным ниже, можно использовать с 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 ({}, {name: true, email: true, phone: true});

MySQL: ВЫБЕРИТЕ имя, адрес электронной почты, телефон ОТ таблицы_имя;

Selecting specific fields with where clause

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

MySQL: ВЫБЕРИТЕ имя, адрес электронной почты, телефон ОТ table_name WHERE email = 'you@email.com';


3

Это работает для меня,

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

нет условия в предложении where, т.е. внутри первых фигурных скобок. внутри следующих фигурных скобок: список имен полей проекции, которые необходимо указать в результате, а 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}})

Здесь ключ присутствует внутри объекта с именем object

{ "_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',{});

Или, 2-й способ: использование 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.