我正在尝试为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的新手,所以我不是100%清楚地了解列表与数组与对象的差异或情境使用以及其他一些事情
更新
根据其他研究,我开始怀疑这是async.map()
的问题。我绝对可以在这里使用一些建议。
以下是我认为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;
}
})
};
答案 0 :(得分:0)
看看是否有效:
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);