Подтвердить что ты не робот

Метеор: как искать только отдельные значения полей, например, collection.distinct( "fieldname" ), похожие на Mongo's

Я использую Meteor, и я пытаюсь найти только отдельные (уникальные) значения поля. Mongodb имеет команду

Collection.distinct("fieldname");

но он не реализован в гонщике Meteor для Mongo. Я попытался использовать пакет meteor-mongo-extensions, но все еще получил "undefined" на клиентской консоли для клиентской стороны Collection.distinct("fieldname");

что, в сущности, является отличным поиском?

Мне кажется, что это такой базовый запрос, например, список учеников со своим учителем в качестве поля, а затем, например, составление списка учеников среди преподавателей...

Если я могу просто обернуть свой ленивый странствующий мозг вокруг общей концепции, я могу, возможно, bash сделать что-то работоспособное.

4b9b3361

Ответ 1

Вы можете просто использовать underscore.js, который поставляется вместе с Meteor, - должно быть хорошо для предлагаемого варианта использования. Вы можете столкнуться с проблемами производительности, если попробуете это на большом наборе данных или запустите его несколько раз, но он должен быть достаточным для использования в обычном или садовом режиме:

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

Это приведет к возврату отдельных записей в myField для всех документов в Collection. Извините, если однострочный просмотр выглядит немного громоздким; параметры sort и fields и флаг true предназначены только для повышения эффективности.

Ответ 2

Если вы предпочитаете делать это на сервере и, таким образом, сохраняете клиентскую память и пропускную способность, попробуйте этот агрегатор. Он обертывает "отличную" функцию mongodb. https://github.com/zvictor/meteor-mongo-server/

Ответ 3

Улучшение ответа 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

Непонятное, чистое монго решение - получить прямой доступ к необработанной коллекции. Это включает в себя обещание (хотя вы можете использовать await для ожидания разрешенного значения).

Примечание. Он будет работать на сервере MongoDB и возвращать клиенту различные значения.

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