【问题标题】:Mongoose returning all fields regarding schemaMongoose 返回有关架构的所有字段
【发布时间】:2018-06-17 04:30:34
【问题描述】:

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

架构

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 执行时,文档的所有字段都会返回。

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

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    我最后做的是为猫鼬模型创建一个静态方法,称为findBusinesses,而不是在我的路由中调用常规的find,而是调用静态方法,它自称为find,maps结果和回报。

    这是代码

    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】:

      在选择功能中,只需将您想要的字段设置为 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));
          })
      });
      

      【讨论】:

        【解决方案3】:

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

        来自文档

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

        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 表示排除。但不要混合使用。

        【讨论】:

          【解决方案4】:

          您也可以只使用 "string" 来告知要获取哪些字段以及要排除哪些字段

          Business.find().select("name status")
          

          ?这告诉猫鼬获取字段“名称”,“状态”,但保留所有其他字段

          【讨论】:

            猜你喜欢
            • 2021-02-05
            • 2018-04-19
            • 2014-04-04
            • 2014-02-01
            • 2021-10-19
            • 2014-11-23
            • 2018-12-10
            • 2014-09-16
            • 1970-01-01
            相关资源
            最近更新 更多