2014-09-13 4 views
1

Я пытаюсь найти некоторую информацию о пользователях в моем Meteor mongo db.Метеор: поиск данных в коллекции mongodb

меня установлен пакет ролей, и я хочу, чтобы найти число пользователей, администраторов бизнес-пользователей, потребителей и т.д.

«ролей», как пользователь «электронная почта» атрибут в том смысле, что это массив ,

Так, например, если я хочу найти количество пользователей admin в массиве ролей, как бы я это сделал. Я бы изображение было бы что-то вроде этого:

Meteor.users.find({roles: ['admin']}).count() 

Спасибо

ответ

4

Я полагаю, формат ваших документов на самом деле что-то вроде этого:

{ "name": "Bill", "roles": [ "admin", "user" ] } 
{ "name": "Ted", "roles": [ "admin", "user", "moderator" ] } 
{ "name": "Death", "roles": [ "user", "moderator" ] } 

В этом случае запрос, который определяет ищет «администратора» следующим образом:

Meteor.users.find({ "roles": ["admin"] }).count() 

Не соответствует никаким документам на ll, так как эта форма потребует «admin» только в элементе массива. Это то, что ваш запрос в основном запрашивает в виде «точного соответствия» содержимому в «ролях».

Meteor по-прежнему применяет основные правила MongoDB, даже если все операторы в настоящее время не поддерживаются в minimongo для клиента браузера. Но ваш запрос на самом деле довольно простой, предполагая, что эти данные уникальны для каждой роли для каждого пользователя. Просто оформить так:

Meteor.users.find({ "roles": "admin" }).count() 

Так до тех пор, как один из элементов в массиве ролей на самом деле соответствует «администратору», то этот документ подсчитанному в результатах.

Это распространенное заблуждение, что «массив» должен обрабатываться специальными операторами для запросов. Фактически, наоборот, где операторы, такие как $in и $nin, а также $all, а другие сами принимают «массив» аргументов для тестирования по элементу. За исключением $all, большинство операторов не нуждаются в, которые применяются к массиву как таковым и могут применяться к «любому» полю. И ни один из них не имеет смысла, если вам не нужно проверять наличие более чем одного значения за раз.

Если вам просто нужен админ, тогда запросите, как показано.Если вам нужно либо "пользователь" или "админ" использовать $in:

Meteor.users.find({ "roles": { "$in": ["user", "admin"] } }).count() 

То же самое для "Билла" или "Ted" в "имя", которое не является массивом:

Meteor.users.find({ "name": { "$in": ["Bill", "Ted"] } }).count() 

Или, если вам нужно как «админ» и «замедлитель» в массиве с помощью $all

Meteor.users.find({ "roles": { "$all": ["moderator", "admin"] } }).count() 

Но вам не нужны эти операторы, если вы не тестируете более одного значения. Поэтому просто проверьте значение

+0

Пропустил эффект брекетов [], спасибо. – Paul

+0

Спасибо, Нил за ваши объяснения, теперь он работает! – user1532669

3

вы можете выполнить это, помните, выполнить его на сервере, потому что minimongo не поддерживает все querys ...

Meteor.users.find({ roles: { $all: [ "admin"] } }).count(); 

Оператор $ all выбирает документы, в которых значение поля представляет собой массив, содержащий все указанные элементы. Чтобы указать $ все выражения, используйте следующий прототип:

http://docs.mongodb.org/manual/reference/operator/query/all/#op._S_all

+0

Операторы, такие как '$ all', не нужны для одиночных значений. Они применяются только там, где есть «список» необходимых аргументов. Не имеет значения, что целевой элемент представляет собой массив. –

+0

да, вы правы, в этом случае не нужно. –

+0

Спасибо, Уолтер, не знал, что minimongo не поддерживает все запросы, но думая об этом, на самом деле это не то, что минимально для :) – user1532669

Смежные вопросы