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

时间:2014-04-23 20:37:10

标签: meteor distinct

我正在使用Meteor,我试图只找到一个字段的不同(唯一)值。 Mongodb有命令

Collection.distinct("fieldname");

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

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

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

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

4 个答案:

答案 0 :(得分:25)

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

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

这将为myField中的所有文档返回Collection中的不同条目。如果单线看起来有点笨拙,请道歉; sortfields选项以及true标记只是为了提高效率。

答案 1 :(得分:8)

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

答案 2 :(得分:4)

改善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');

答案 3 :(得分:2)

非Underscore,纯mongo解决方案是直接访问原始集合。这涉及Promise(尽管您可以使用await等待已解析的值)。

Collection._collection.rawCollection().distinct('fieldname').then(distinctValues => console.log(distinctValues))