Я полагаю, формат ваших документов на самом деле что-то вроде этого:
{ "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()
Но вам не нужны эти операторы, если вы не тестируете более одного значения. Поэтому просто проверьте значение
Пропустил эффект брекетов [], спасибо. – Paul
Спасибо, Нил за ваши объяснения, теперь он работает! – user1532669