【发布时间】: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