我有一个类似的文件
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' } }
答案 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版中更改它。