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