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

时间:2015-01-04 06:54:47

标签: 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, 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]]
});

1 个答案:

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