Mongoose返回有关模式的所有字段

时间:2018-01-08 07:49:52

标签: node.js mongodb mongoose mongoose-schema

我的数据库中有一个名为商家的集合。我想要做的是查询我的架构中定义的数据库和特定字段,而不是查询文档的所有字段。我认为这就是为什么架构首先存在的原因?

模式

var businessSchema = new mongoose.Schema({
    custom_id: String,
    name: String
});

module.exports = mongoose.model('Business', businessSchema);

快速

router.get('/query', function (req, res, next) {
    res.type('json');
    Business.find({custom_id: req.query.custom_id})
        .then(function (data) {
            res.send({data: data});
        }).catch(function (err) {
        return next(new Error(err.message || err));
    })
});

响应

{
   "data":[
      {
         "_id":"5a50ac105a0d8452b0e341e5",
         "custom_id":"1",
         "name":"Dave and Jane",
         "status":"active",
         "verified":true,
         "created":1492727550760,
         "email":{
            "address":"dave_jane@whatever.com"
         }
      }
   ]
}

在架构中,我只有custom_id和name,但是我定义的任何字段(或者我都没有),Business.find执行时会返回文档的所有字段。

与架构为空的行为相同,因此返回所有字段。

3 个答案:

答案 0 :(得分:1)

在选择功能中,只需将您想要的字段设置为1,将您想要的字段设置为0.请参阅下文:

router.get('/query', function (req, res, next) {
    res.type('json');
    Business.find({custom_id: req.query.custom_id}).select({ "name": 1, "_id": 0})
        .then(function (data) {
            res.send({data: data});
        }).catch(function (err) {
        return next(new Error(err.message || err));
    })
});

答案 1 :(得分:0)

我最后做的是为猫鼬模型制作一个静态方法,称为findBusinesses而不是在我的路线中调用常规find我调用静态方法,它自称查找,映射结果并返回。

这是代码

businessSchema.statics.findBusinesses = function (query) {
    var deferred = Q.defer();
    this.find(query, function (error, data) {
        if (error) return deferred.reject(new Error(error));
        var models = [];
        data.forEach(function(e){
            var b = {
                custom_id: e.custom,
                name: e.name,
                phone: e.phone,
                };
            if(e.email) b.email = e.email.address;
            models.push(b);
        });
        return deferred.resolve(models);     // got it
    });
    return deferred.promise;
};

答案 2 :(得分:0)

您可以使用select指定希望查询返回的字段。

来自Doc

  

指定要包含或排除的文档字段(也称为查询“投影”)

router.get('/query', function (req, res, next) {
    res.type('json');
    Business.find({custom_id: req.query.custom_id}).select({
      name: 1,
      profile_url: 1
    }).then(function (data) {
            res.send({data: data});
        }).catch(function (err) {
        return next(new Error(err.message || err));
    })
});

1表示该字段将被包含在内。 0表示被排除在外。但不要混合两者。