【问题标题】:No value for `distinct` has been declared没有声明`distinct`的值
【发布时间】:2015-10-19 10:27:06
【问题描述】:

我正在尝试向我的 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;
        }
     })
};

【问题讨论】:

  • 检查this related question。我比你更不熟悉 MongoDB 和 Mongoose,但也许如果你将 this.distinct( 更改为 this.collection.disctinct( 甚至 mySchema.distinct( 它会起作用吗?
  • 感谢您的建议。我在发布之前确实检查了一个,但是自从发布该问题以来的四年内,用于区分的 Mongoose API 已得到修复。在仅使用一个字段(如 api 要求)的模型上使用正常的 distinct 方法就可以了。
  • 这个问题已经 4 岁了! - 对不起,我应该检查一下。我道歉。它似乎是特定于图书馆的,我不能帮助你(还)。 (错误消息似乎说它只是不知道如何做你问的事情.. :-))
  • 是的,我正在尝试将我的方法转换为可以从 mongoshell 运行的函数,以查看它是否呈现相同的错误。这样我就知道是Mongo还是Mongoose在抱怨。目前尚不清楚为什么 distinct 在一种情况下会出现问题,而在另一种情况下则不会。
  • 令人费解。我忘了问的最后一件事:不可能是争论不成立,对吗?例如,我希望myThing.manyDistinct(myFields, fn) (语义上)产生manyDistinct( err = fields, fields = callback, callback = undefined )

标签: node.js mongodb mongoose mean-stack node-async


【解决方案1】:

看看这是否有效:

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

【讨论】:

  • 这会阻止错误发生,但是它会返回一个空数组,这更令人费解。
  • 我只是想修复代码中的语法错误。将调试语句放入您的代码中,以了解您的数据发生了什么。错误字段是否返回任何内容?您将什么传递给函数 mySchema.statics.manyDistinct。你能贴一个调用这个方法的例子吗?
  • 您的版本没有返回错误。调用该函数的示例在原始帖子中,即我今天进行更新之前的倒数第二个代码块。当我将console.log(dat); 添加到该行之前,它会被字符串化并添加到数组/对象中,它只返回空数组。
  • 执行 myThing.find() 时是否得到所有结果,只要确定它是否不是数据分配问题。
  • 是的,运行myThing.find()myThing.findOne()myThing.distinct('field') 都按预期返回结果。来自 SQL,我会认为 distinct() 方法将接受许多字段的名称并返回包含的每个字段的不同值。我惊讶地发现这不是 MongoDB(以及因此 Mongoose)的工作方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 2019-07-11
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
相关资源
最近更新 更多