2015-12-15 6 views
2

Я хочу найти ближайших рабочих по его местонахождению, обладающих определенным навыком..where() по населенным полям

Расположения Схема:

var schema = Schema({ 
    name: String, 
    type: String, // home | latest 
    user: {type: Schema.Types.ObjectId, ref: 'User'}, 
    address: String, 
    position: { 
     type: {type: String, default: 'Point'}, 
     coordinates: [Number] 
    }, 
    status: String // active | inactive 
}, {collection: 'locations'}); 

работника схема:

var schema = Schema({ 
    username: String, 
    password: String, 
    firstName: {type: String, default: ''}, 
    middleName: {type: String, default: ''}, 
    lastName: {type: String, default: ''}, 
    role: {type: String, default: 'user'}, // admin | user | worker 
    skills: [{ 
     object: {type: Schema.Types.ObjectId, ref: 'Skill'}, 
     slug: String, // Should remove in the future 
     ratePerHour: Number, 
     status: {type: String, default: 'active'} // active | inactive 
    }], 
    locations: [{type: Schema.Types.ObjectId, ref: 'Location'}] 
}, {collection: 'users'}); 

навык схема:

var schema = Schema({ 
    name: String, 
    slug: String, 
    users: [{type: Schema.Types.ObjectId, ref: 'User'}], 
    isFeatured: Boolean, 
    minRatePerHour: Number, 
    maxRatePerHour: Number, 
    status: String // active | inactive | deleted 
}, {collection: 'skills'}); 

пыльник мой запрос, но .where() не работает с заполненным полем.

Location 
    .find({ 
     'position': { 
      $near: { 
       $geometry: {type: 'Point', coordinates: [lat, lng]}, 
       $minDistance: 0, 
       $maxDistance: 20000 
      } 
     } 
    }) 
    .populate('user') 
    .deepPopulate('user.skills.object') 
    .where({'user.skills': {$elemMatch: {'object.slug': 'cleaning'}}}) 
    .limit(5) 
    .exec(callback); 

Я делаю неправильно эти схемы? Должен ли я использовать встроенный документ, а не ссылку на идентификатор? Есть ли еще какой-нибудь запрос?

ответ

0

Вы должны использовать специальные свойства для populate, как описано здесь: Query conditions and other options

Так что я думаю, что вы можете получить результаты с чем-то вроде этого:

Location 
.find({ 
    'position': { 
    $near: { 
     $geometry: { 
     type: 'Point', 
     coordinates: [lat, lng] 
     }, 
     $minDistance: 0, 
     $maxDistance: 20000 
    } 
    } 
}) 
.populate({ 
    path: 'user', 
    match: { 
    'skills': { 
     $elemMatch: { 
     'object.slug': 'cleaning' 
     } 
    } 
    }, 
    options: { 
    limit: 5 
    } 
}) 
.deepPopulate('user.skills.object') 
.exec(callback); 

Не тестировался, держите его только в качестве примера.

+0

'object.slug' существует только после' .deepPopulate() '... за пределами поля' object' содержит значение 'Skill._id' – Manhhailua

+0

Это всего лишь пример, который вы должны просмотреть и исправить для своих нужд. –

+0

Я попробовал параметр 'match' в' .populate() 'несколько раз, но он влияет только на объект, который будет заполнен. Поле 'user' будет' null', если пользователь не будет соответствовать во время совокупности. – Manhhailua

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

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