猫鼬,查找,返回特定属性

时间:2014-08-15 16:43:39

标签: node.js mongodb mongoose

我接到了这个电话:

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);

我不想让我的休息电话中包含的物品数组。

6 个答案:

答案 0 :(得分:22)

你使用投影。 mongoose query docs中的第一个示例包含投影操作。

注意:不是真正的代码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架构,但我认为该示例足够清晰。

答案 1 :(得分:11)

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

这将仅返回字段名称,年龄和地址。

答案 2 :(得分:7)

Mongoose 提供了多种使用 findfindOnefindById 来投影文档的方法。

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 });

您也可以使用 findfindById 方法执行相同操作。

答案 3 :(得分:2)

.select() 的帮助下,这是可能的。

  • 如果所需的字段数少于总字段数,则 .select('projectId user') 可以使用
  • 否则,要忽略的字段数少于总字段数, 可以使用 .select('-items')

所以为了获取一个字段,简单地,可以传递空格分隔的字段字符串,而对于忽略该字段,可以在使用该字段之前用空格分隔的字符串“-”。

对于more documentation

答案 4 :(得分:1)

.Select() 方法用于选择查询结果中要返回哪些字段

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

答案 5 :(得分:-7)

您需要定义模型架构http://mongoosejs.com/docs/guide.html