2014-12-04 1 views
1

У меня есть два пользователя и запросы моделей mongoose. Один пользователь может иметь несколько запросов. Чтобы связать эти две модели данных, я ссылаюсь на идентификатор объекта пользователя в модели Request. Однако, когда я пытаюсь получить все запросы для определенного ID пользователя, я не получаю никакого результата.Ссылка на модель данных с использованием ObjectID в Mongoose

Пользователи

var UserSchema = new Schema({ 
     name: String, 
     username: String 
    }); 
module.exports = mongoose.model('User', UserSchema); 

просит

var RequestSchema = new Schema({ 
    type: String, 
    user_id: { type : mongoose.Schema.Types.ObjectId, ref: 'User'} 
}); 
module.exports = mongoose.model('Request', RequestSchema); 

Ниже приведен пример кода, который получает запросы на основе идентификатора пользователя передается в URL

exports.getRequests = function (req, res, next) { 
     var userId = req.params.id; 
     console.log('USER ID'+userId); 

     Request.findOne({'user_id': 'kenan'}, function (err, request) { 
     if (err) return next(err); 
     if (!requests){ 
      console.log('NO REQUEST FOUND'); 
      return res.send(401); 
     } 
     res.json(request); 
     }); 
}; 

Iзнаю, что я использую findOne, который вернет мне один ресурс. Однако это не работает, и я не получаю никакого результата. У меня в моей БД данные заселены. Ниже приведен URL для получения запросов.

http://localhost:9000/api/V1/users/547ee1e82e47bb982e36e433/requests 

Пожалуйста, подскажите, что я делаю неправильно здесь.

Благодаря

ответ

1

Вы должны populate ссылки на пользователей, как только вы делаете find().

  • После того, как вы найдете все запросы, вам необходимо устранить ссылки на пользователей . Используйте populate для разрешения ссылок.
  • После того, как вы решите, отфильтруйте запросы на основе name, которые вы ищете .

Обновленный код:

Request 
.find().populate({'path':'user_id',match:{'name':'kenan'}}) 
.exec(function (err, resp) { 
    var result = resp.filter(function(i){ 
    return i.user_id != null; 
    }); 
console.log(result); 
}) 
+0

Спасибо за ваш ответ. Я попробую это. Однако я пытаюсь найти с помощью Request.findOne(). Здесь также мне нужно использовать населенность? Мое понимание заключалось в том, что заполнение должно использоваться при поиске родительской схемы, в данном случае для пользователей. – Sashi

+0

Populate используется для разрешения ссылок. В этом случае ваш user_id должен быть разрешен. Конструкция схемы идеально подходит для запроса, чтобы найти всех пользователей для определенного типа запроса. – BatScream

+0

Но я хотел бы найти все запросы от определенного user_id. Почему я не могу просто запросить схему запроса и указать user_id точно так же, как и любой другой столбец. – Sashi

0

ОК, выше ответ правильный и спасибо за ваш ответ. Я неправильно заполнил коллекцию запросов. Это просто для всех остальных знаний. Когда у вас есть ссылка на идентификатор объекта как одно из полей в коллекции, убедитесь, что вы вставляете объект ObjectID вместо простого числового значения.

Неправильные

{ "_id" : ObjectId("54803ae43b73bd8428269da3"), "user_id" : "547ee1e82e 
47bb982e36e433", "name" : "Test", "service_type" : "test", "version" : "10" 
, "environment" : "test", "status" : "OK", "__v" : 0 } 

Правильные

{ "_id" : ObjectId("54803ae43b73bd8428269da3"), "user_id" : ObjectId("547ee1e82e 
47bb982e36e433"), "name" : "test", "service_type" : "test", "version" : "10" 
, "environment" : "test", "status" : "OK", "__v" : 0 } 
Смежные вопросы