在Mongoose查询中使用variables作为属性名称不能返回正确的结果

我试图用Mongoose获得具有某个特定属性的文档,出于某种原因,如果我在属性名称的循环中使用variables,它将不会返回正确的值。 例如,下面的代码可以很好地工作:

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]] }); 

但是,当我实际使用属性名称的迭代器variables时,我需要这样做,因为我将使用更大的语音types列表来完成此操作,所以不会给出正确的答案。

 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]] }); 

您需要更改代码:

 Artist.count({voiceType: true}, function(err, count) {...} 

如,

 var query = {}; query[voiceType] = true; Artist.count(query, function(err, count) {...} 

这是必需的,因为在java脚本中创build一个包含键值对的Object时,这些keys被强制为Stringtypes。

因此, {voiceType: true}实际上将被parsing为{"voiceType": true} ,导致查询返回0条logging。

相反,当您将一个值指定为query[voiceType] = true; ,首先将variablesvoiceTypeparsing为lyric_soprano ,然后将其设置为该对象,并导致查询获取正确的行数。