Javascript 在Mongoose查询中使用变量作为属性名未返回正确结果

Javascript 在Mongoose查询中使用变量作为属性名未返回正确结果,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我试图使用Mongoose获取具有特定属性的文档计数,由于某种原因,如果在循环中使用变量作为属性名,它将不会返回正确的值。例如,以下代码本身就可以正常工作: Artist.count({lyric_soprano: true}, function(err, count) { console.log(count); // 17 }); 当我在循环中键入属性名称时,它也会起作用,如下所示: var voices = ["lyric_soprano"]; async.map(voices,

我试图使用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]]
});

您需要更改代码:

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

这是必需的,因为在java脚本中创建包含键值对的
对象时,
被强制为
字符串
类型

因此,,
{voiceType:true}
实际上将解析为
{“voiceType:true}
,从而导致查询返回
0
记录


相反,当您将值赋值为
query[voiceType]=true
,变量
voiceType
首先解析为
lyric\u soprano
,然后设置为对象,结果查询获得正确的行数。

请查看下面的答案,如果有帮助,请单击答案左侧的勾号接受/向上投票。
var query = {};
query[voiceType] = true;
Artist.count(query, function(err, count) {...}