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

Using variable for attribute name in Mongoose query not returning correct result

我正在尝试使用 Mongoose 获取具有特定属性的文档的数量,但出于某种原因,如果我在循环内使用变量作为属性名称,它将不会 return 正确的值。例如,下面的代码本身就可以正常工作:

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) {...}

作为,

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 然后设置为对象,导致查询获取正确的行数。