2

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()ます。私は間違いなくここでいくつかのアドバイスを使うことができます.

の async.map バージョンは次のmanyDistinct()ようになります。

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;
        }
     })
};
4

1 に答える 1