2017-01-15 1 views
0

Я использую Mongoose версии 4.6.8 и MongoLab (MLab). У меня есть Mongoose схема под названием «Группа», которая имеет коллекцию поддокументов пользователей называемых «учители»:Mongoose: Как найти документы по значению свойства документа подкатегории

Это документ из коллекции «группа» на MongoLab:

{ 
//…more properties here…// 
    "teachers": [ 
     { 
      "$oid": "5799a9c759feea9c208c004c" 
     } 
    ] 
} 

И это документ из коллекции «пользователи» на MongoLab:

{ 
//…more properties here…// 
    "username": "bob" 
} 

Но если я хочу, чтобы получить список групп, которые имеют конкретный учитель (User) с именем пользователя «боб», это не работает (список групп пуст):

Group.find({"teachers.username": "bob"}).exec(callback); 

Это также не возвращает элементы:

Group.find().where('teachers.username').equals('bob').exec(callback); 

Как я могу добиться этого?

ответ

0

Я думаю, что решение в этом случае, чтобы получить группы учительской через модуль пользователя вместо моего первого наклона, который должен был пройти через модуль групп. Это имеет смысл, поскольку оно соответствует тому, как современные API представляют собой отношения «один ко многим».

В качестве примера, в API Behance, в конечной точке для проектов пользователя является:

GET /v2/users/user/projects 

И запрос на эту конечную точку (где имя пользователя пользователя является «matiascorea») будет выглядеть следующим образом:

https://api.behance.net/v2/users/matiascorea/projects?client_id=1234567890 

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

User.findOne({username: 'bob'}) 
    .populate('groups') 
     .exec(callback); 

И вызов API для этого будет:

GET /api/users/user/groups 

И просьба к этой конечной точке будет выглядеть следующим образом:

https://example.com/api/users/bob/groups 
1

Вы можете использовать populate для этого.

Попробуйте это:

Group.find({}) 
    .populate({ 
     path : 'teachers' , 
     match : { username : "bob" } 
     }) 
     .exec(callback); 

populate будет populate на основе teachers области (с учетом path) и match будет возвращать только те, у кого есть username боб.

Дополнительную информацию о mongoose populate options, пожалуйста, см. Mongoose populate documentation.

+0

Это возвращает все группы в то время как я хочу, чтобы получить только те группы, у которых есть учитель с именем пользователя «Боб». –

+0

Это работает в аналогичном случае для меня, вы уверены, что он не работает? Можете ли вы дважды проверить? –

+0

Я пробовал, и он возвращает все группы. –

1

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

User.findById(<Id of Bob>, function(err, user){ 
    Group.find({}, function(err, groups){ 
     var t = groups.map(function(g){ 
     if(g['teachers'].indexOf(user.id)) 
      return g 
     }) 
    // Do something with t 
    }) 
}) 
+0

Спасибо, Майк, ваш ответ заставил меня подумать о приближении к нему под другим углом - через модуль пользователей вместо групп. Я не могу отметить ваш ответ как принятый, потому что группы могут быть заполнены пользователем (который вы бы знали, если бы я применил свойство groups в моем примере кода). –

+0

Рад, что вы поняли! – Mike

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

  • Нет связанных вопросов^_^