当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Meteor:如何只搜索不同的字段值,即一个类似于Mongo的collection.distinct("fieldname")》经验,为你挑选了4个好方法。

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

Collection.distinct("fieldname");

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

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

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

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



1> richsilv..:

你可以使用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标志只是为了使之更有效率.


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

2> pelón..:

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


看起来像https://github.com/monbro/meteor-mongodb-mapreduce-aggregation/有更多的更新爱,从zvictor's分叉.它在气氛上更受欢迎.

3> Adriano P..:

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



4> 小智..:

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

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

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

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有