我试图使用Mongoose获取具有某个属性的文档计数,并且由于某种原因,如果我在循环内使用属性名称的变量,它将不会返回正确的值。例如,下面的代码本身就可以正常工作:
Artist.count({lyric_soprano: true}, function(err, count) {
console.log(count); // 17
});
当我在循环中输入属性名称时,它也可以工作,如下所示:
var voices = ["lyric_soprano"];
async.map(voices, function(voiceType, callback) {
console.log(voiceType); // "lyric_soprano"
console.log(typeof voiceType); // String
console.log(voiceType == "lyric_soprano"); // true
Artist.count({lyric_soprano: true}, function(err, count) {
console.log(count); // 17
callback(null, count);
});
}, function(err, results) {
console.log(results); // [[17]]
});
然而,当我实际使用迭代器变量作为属性名称时,我需要做的就是我要用更大的语音类型列表来做这件事,它并没有给我正确的答案。
var voices = ["lyric_soprano"];
async.map(voices, function(voiceType, callback) {
console.log(voiceType); // "lyric_soprano"
console.log(typeof voiceType); // String
console.log(voiceType == "lyric_soprano"); // true
Artist.count({voiceType: true}, function(err, count) {
console.log(count); // 0
callback(null, count);
});
}, function(err, results) {
console.log(results); // [[0]]
});
答案 0 :(得分:2)
您需要更改代码:
Artist.count({voiceType: true}, function(err, count) {...}
如,
var query = {};
query[voiceType] = true;
Artist.count(query, function(err, count) {...}
这是必需的,因为在java脚本中创建包含键值对的Object
时,keys
会被强制转换为String
类型。
因此,
{voiceType: true}
实际上将被解析为{"voiceType": true}
,从而导致查询返回0
条记录。
相反,当您将值分配为query[voiceType] = true;
时,变量voiceType
首先被解析为lyric_soprano
,然后设置为该对象,从而导致查询获取正确的数字行。