Мангуст, найти, вернуть конкретные свойства

У меня есть этот вызов:

exports.getBIMFromProject = function(req, res){
  mongoose.model('bim').find({projectId: req.params['prj_id']}, function(err, bim){
    if(err){
      console.error(err);
      res.send(500)
    }
    res.send(200, bim);
  });
};

Где я могу указать, какие свойства я хочу вернуть? Не могу найти это в документах. Выше возвращает весь объект. Я только хочу вернуть несколько свойств.

Это моя схема:

var mongoose = require('mongoose'),
  Schema = mongoose.Schema;

var bimSchema = new Schema({
  projectId: Number,
  user: String,
  items:[
    {
      bimObjectId: Number,
      typeId: String,
      position:{
        floor: String,
        room:{
          name: String,
          number: String
        }
      }
    }
  ]
});

mongoose.model('bim', bimSchema);

Я не хочу, чтобы массив items был включен в мой вызов rest.

7 ответов

Решение

Вы используете проекцию. В первом примере в документации по запросу mongoose есть проекционная операция.

NB: не реальный код B / C Я выделил важные биты с тройными звездами

// find each person with a last name matching 'Ghost', ***selecting the `name` and `occupation` fields***
Person.findOne({ 'name.last': 'Ghost' }, ***'name occupation'***, function (err, person) {
  if (err) return handleError(err);
  console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation) // Space Ghost is a talk show host.
})

Person схема не указана, но я думаю, что пример достаточно ясен.

Mongoose предоставляет несколько способов проектирования документов с помощью, findOne, и .

1. Проекция в виде строки:

      // INCLUDE SPECIFIC FIELDS
// find user and return only name and phone fields
User.findOne({ email: email }, 'name phone');

// EXCLUDE SPECIFIC FIELD
// find user and return all fields except password
User.findOne({ email: email }, '-password');

2. Проекция мимоходом projection свойство:

      // find user and return just _id field
User.findOne({ email: email }, {
  projection: { _id: 1 }
});

3. Использование .select() метод:

      // find user and return just _id and name field
User.findOne({ email: email }).select('name');

// find user and return all fields except _id
User.findOne({ email: email }).select({ _id: 0 });

Вы можете сделать то же самое с find и findById методы тоже.

MyModel.find({name: "john" }, 'name age address', function(err, docs) { })

Это вернет только имя поля, возраст и адрес.

.Select() метод используется для выбора, какие поля должны быть возвращены в результате запроса

      let result = await MyModel.find({ user : "user" }).select('name lastname status')

С помощью .select() это возможно.

  • Если количество требуемых полей меньше общего количества, .select('projectId user') может быть использован
  • Остальное количество полей, которые следует игнорировать, меньше общего количества полей, тогда .select('-items') может быть использован.

Таким образом, для получения поля можно просто передать строку полей, разделенную пробелом, а для игнорирования поля - строку, разделенную пробелом, со знаком «-» перед использованием поля.

Для получения дополнительной документации .

Найти определенные свойства также избегать некоторых свойств

      await User.find({ email: email }, { name: 1, phone: 1, status: 1, password: 0 });

Вам необходимо определить схемы вашей модели http://mongoosejs.com/docs/guide.html

Другие вопросы по тегам