在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
被强制为String
types。
因此, {voiceType: true}
实际上将被parsing为{"voiceType": true}
,导致查询返回0
条logging。
相反,当您将一个值指定为query[voiceType] = true;
,首先将variablesvoiceType
parsing为lyric_soprano
,然后将其设置为该对象,并导致查询获取正确的行数。