我正在使用Meteor,而我正在尝试仅查找字段的不同(唯一)值.Mongodb有命令
Collection.distinct("fieldname");
但它没有在Mongo的Meteor驱动程序中实现.我尝试过使用meteor-mongo-extensions软件包,但客户端控制台仍然有一个"未定义"的客户端Collection.distinct("fieldname");
什么,基本上是一个独特的寻找?
我觉得有人这是一个基本的查询 - 例如,一个学生列表,他们的老师作为一个领域,然后由教师制作一份学生名单,例如......
如果我可以将我懒惰的大脑包裹在一般概念中,我可能会抨击一些可行的东西.
你可以使用Meteor附带的underscore.js - 对于建议的用例应该没问题.如果您在大量数据集上尝试此操作或重复运行,可能会遇到性能问题,但它应该足以满足常见或园艺用法:
var distinctEntries = _.uniq(Collection.find({}, { sort: {myField: 1}, fields: {myField: true} }).fetch().map(function(x) { return x.myField; }), true);
这将返回myField
所有文档中的不同条目Collection
.如果单线看起来有点笨拙,请道歉; 在sort
和fields
选项和true
标志只是为了使之更有效率.
如果您更喜欢在服务器上执行此操作,从而节省客户端内存和带宽,请尝试使用此聚合器程序包.它包含了mongodb的"独特"功能.https://github.com/zvictor/meteor-mongo-server/
改善richsilv的答案:
function distinct(collection, field) {
return _.uniq(collection.find({}, {
sort: {[field]: 1}, fields: {[field]: 1}
}).fetch().map(x => x[field]), true);
}
如何使用:
var arrResults = distinct(MyCollection, 'myfield');
一个非下划线的纯mongo解决方案将是直接访问原始集合。这涉及一个Promise(尽管您可以使用它await
来等待解析的值)。
注意:它将在MongoDB服务器上运行,并向客户端返回不同的值。
Collection._collection.rawCollection().distinct('fieldname').then(distinctValues => console.log(distinctValues))