Meteor:如何只搜索不同的字段值,即一个类似于Mongo的collection.distinct("fieldname")

aar*_*n p 24 distinct meteor

我正在使用Meteor,而我正在尝试仅查找字段的不同(唯一)值.Mongodb有命令

Collection.distinct("fieldname");
Run Code Online (Sandbox Code Playgroud)

但它没有在Mongo的Meteor驱动程序中实现.我尝试过使用meteor-mongo-extensions软件包,但客户端控制台仍然有一个"未定义"的客户端Collection.distinct("fieldname");

什么,基本上是一个独特的寻找?

我觉得有人这是一个基本的查询 - 例如,一个学生列表,他们的老师作为一个领域,然后由教师制作一份学生名单,例如......

如果我可以将我懒惰的大脑包裹在一般概念中,我可能会抨击一些可行的东西.

ric*_*ilv 27

你可以使用Meteor附带的underscore.js - 对于建议的用例应该没问题.如果您在大量数据集上尝试此操作或重复运行,可能会遇到性能问题,但它应该足以满足常见或园艺用法:

var distinctEntries = _.uniq(Collection.find({}, {
    sort: {myField: 1}, fields: {myField: true}
}).fetch().map(function(x) {
    return x.myField;
}), true);
Run Code Online (Sandbox Code Playgroud)

这将返回myField所有文档中的不同条目Collection.如果单线看起来有点笨拙,请道歉; 在sortfields选项和true标志只是为了使之更有效率.

  • 流星集合游标有自己的[map function](http://docs.meteor.com/#/full/map)所以不需要`fetch()`只是`Collection.find({}).map(function(function) x){return x.myField;})`. (7认同)
  • 说实话,我不是mongo专家所以它可能没什么,但我会假设内部mongo方法会比将整个查询集加载到内存中,迭代它并返回数组更优雅.很容易想象mongo方法如何比这更具记忆效率. (4认同)

pel*_*lón 8

如果您更喜欢在服务器上执行此操作,从而节省客户端内存和带宽,请尝试使用此聚合器程序包.它包含了mongodb的"独特"功能.https://github.com/zvictor/meteor-mongo-server/

  • 看起来像https://github.com/monbro/meteor-mongodb-mapreduce-aggregation/有更多的更新爱,从zvictor's分叉.它在气氛上更受欢迎. (2认同)
  • @Philippe 见上面的包:`meteor add monbro:mongodb-mapreduce-aggregation` (2认同)

Adr*_*o P 6

改善richsilv的答案:

function distinct(collection, field) {
  return _.uniq(collection.find({}, {
    sort: {[field]: 1}, fields: {[field]: 1}
  }).fetch().map(x => x[field]), true);
}
Run Code Online (Sandbox Code Playgroud)

如何使用:

var arrResults = distinct(MyCollection, 'myfield');
Run Code Online (Sandbox Code Playgroud)


小智 5

一个非下划线的纯mongo解决方案将是直接访问原始集合。这涉及一个Promise(尽管您可以使用它await来等待解析的值)。

注意:它将在MongoDB服务器上运行,并向客户端返回不同的值。

Collection._collection.rawCollection().distinct('fieldname').then(distinctValues => console.log(distinctValues)) 
Run Code Online (Sandbox Code Playgroud)