Mongoose:select方法不返回include字段

时间:2015-05-20 05:48:52

标签: node.js mongodb mongoose

我有一个类似的文件

var ConfigSchema = new Schema({
  basicConfig: {
    levelId: {
      type: Number,
      required: true
    },
    hostId: {
      type: Number,
      required: true
    },
    Name: {
      type: String,
      trim: true
    },
    Settings: {
      Type1: {
         // some types here...
      }
      Type2: {
         // some types here...
      }
    }
  },
  enrolls: {
    name: {type: String},
    list: [String]
  },
  awards: {
    enable: {type: Boolean},
    Primary: {
      amount: {type: Number},
      type: {type: String}
    }
  }

现在,我想找到configs匹配hostId匹配60,然后选择basicConfig字段。

Config.findOne({ 'basicConfig.hostId': 60 })
    .select('basicConfig').exec(function(err, configs) {
        if (err) {
            console.error(err);
            return ;
        }

        console.log(configs);   
    });

但是,将返回此文档的所有字段。似乎select不起作用?为什么呢?

输出:

{ _id: 555c4144c0bff1541d0e4059,
  enrolls: {},
  awards: { primary: { PrimarySettings: {}, primaryAck: {} } },
  basicConfig:
   { levelId: 24,
     hostId: 60,
     poolName: 'LC' } }

此外,以下代码已经过测试,但不起作用。

BonusConfig.findOne({ 'basicConfig.hostId': 60 }, 'basicConfig', function(err, configs) {
        if (err) {
            console.error(err);
            return ;
        }
        console.log(configs);
    });

但是,如果basicConfig字段的select字段不含以下代码,则效果很好。

BonusConfig.findOne({ 'basicConfig.hostId': 60 })
    .select('-basicConfig').exec(function(err, configs) {
        if (err) {
            console.error(err);
            return ;
        }
        console.log(configs);
    });

我的代码出了什么问题?

Mongoose版本:3.8.24

Mongodb版本:2.6.7

修改1

这是mongoose调试模式下的查询日志。

Mongoose: configs.findOne({ 'basicConfig.hostId': 60 }) { fields: { basicConfig: 1 } }

修改2

经过进一步调查。

Config.findOne({ 'basicConfig.hostId': 60 }).select('basicConfig')的输出结果:

{ _id: 555c4144c0bff1541d0e4059,
  enrolls: {},
  awards: { primary: { PrimarySettings: {}, primaryAck: {} } },
  basicConfig:
   { levelId: 24,
     hostId: 60,
     poolName: 'LC' } }

basicConfig外,其他字段为空值。但是,我希望结果是

{ _id: 555c4144c0bff1541d0e4059,
  basicConfig:
   { levelId: 24,
     hostId: 60,
     poolName: 'LC' } }

2 个答案:

答案 0 :(得分:1)

您对需要返回的字段的投影缺少附加参数。试试这个:

BonusConfig.findOne({ 'basicConfig.hostId': 60 }, {'basicConfig':1}, function(err, configs) {
        if (err) {
            console.error(err);
            return ;
        }
        console.log(configs);
    });

答案 1 :(得分:0)

引用this

  

这种行为是设计的,但不可否认它设计得不是很好。当从数据库加载时创建子文档时,Mongoose过于热心。计划在第5版中更改它。