没有声明“distinct”的值

我正在尝试为我的Mongoose模型添加一个新的静态方法。 该方法应接受几个字段的名称,并返回一个对象与每个这些字段的不同值。

var mongoose = require('Mongoose'); var Schema = mongoose.Schema; var mySchema = new Schema({Year: Number, Segment: String, Sector: String, Name: String, Group: String, Value: Number}); mySchema.statics.manyDistinct = function(err, fields, callback) { var out = {}; for (var i = 0; i < fields.length; i++) { this.distinct(fields[i], function(err, dat) { if (err) { return err; } else { out[fields[i]] = toJSON.stringify(dat); } }); } callback(err, out); }; mongoose.model('myThing', mySchema); 

数据示例:

 {Year: 2015, Segment: 'North', Sector: 'Alpha', Name: 'Bob', Group: 'Engineering', Value: 12} {Year: 2012, Segment: 'North', Sector: 'Beta', Name: 'Joe', Group: 'Accounting', Value: 29} {Year: 2013, Segment: 'South', Sector: 'Alpha', Name: 'Betty', Group: 'Accounting', Value: 6} 

调用方法和预期输出:

 myThing.manyDistinct(['Year', 'Segment', 'Sector'], function(err, result) { if (err) return err; console.log(result); }); {Year: [2015, 2012, 2013], Segment: ['North', 'South'], Sector: ['Alpha', 'Beta']} 

我得到的是:

 Error: No value for `distinct` has been declared 

请记住,对于JS,Node,MongoDB和Mongoose,我还是比较新的,所以对于像列表,数组和对象等其他东西的区别或情景使用,我并不十分清楚。


更新

基于额外的研究,我开始怀疑这是否是async.map()的问题。 我绝对可以在这里使用一些build议。

这是我认为manyDistinct()的async.map版本应该看起来像。

 mySchema.statics.manyDistinct = function(fields, callback) { async.map(fields, function(field, callback) { this.distinct(field, function(err, result) { if (err) return callback(err); return {field: result}; }) }, function(err, results) { if (err) { return console.log(err); } else { return results; } }) }; 

看看这是否工作:

 mySchema.statics.manyDistinct = function(fields, callback) { var out = {}; var error = null; for (var i = 0; i < fields.length; i++) { this.distinct(fields[i], function(err, dat) { if (err) { error = error? error + ', ' + err : err; } else { out[fields[i]] = toJSON.stringify(dat); } }); } callback(error, out); }; mongoose.model('myThing', mySchema);