2015-01-12 3 views
0

Я пытаюсь настроить приложение nodejs с помощью CRUD для субдокторов mongodb с помощью Mongoose, но не могу понять, как получить доступ к _id вложенного объекта. Я могу получить только родительский объект ObjectId. Я могу выполнить .push на новом дочернем объекте, но не могу выполнить простой get, put или delete на существующем дочернем объекте.CRUD на вложенных схемах с использованием Mongoose

Вот моя схема:

//new user model 

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.ObjectId; 

// Task schema 
var taskSchema = mongoose.Schema({ 
     clientEasyTask    : { type: String }, 
     clientHardTask   : { type: String }, 
     clientStupidTask  : { type: String } 
}); 

var userSchema = new mongoose.Schema({ 
    email: { type: String, unique: true, lowercase: true }, 
    password: String, 

    task    : [taskSchema] 
}); 

module.exports = mongoose.model('Task', taskSchema); 
module.exports = mongoose.model('User', userSchema); 

Вот мои маршруты:

'use strict'; 

var isAuthenticated = require('./middleware/auth').isAuthenticated, 
isUnauthenticated = require('./middleware/auth').isUnauthenticated; 

var User   = require('./models/user'); 
var Task   = require('./models/user'); 

// Create user.task 

module.exports = function (app, passport) { 

    app.post('/api/tasks', isAuthenticated, function (req, res) { 

    var userEmail = req.body.email; 
    var easyTask = req.body.easyTask; 

    User.findOne({ 'email' : userEmail }, function(err, user) { 
     console.log('found user and defining status and data'); 
     var status; 
     var data; 

     if (err) { 
     status = 'error'; 
     data = 'unknown error occurred'; 
     } 
     if (user === null) { 
     status = 'error'; 
     data = 'user not found'; 
     } else { 
     status = 'ok'; 
     data = user; 
     } 

     user.task.push({ 
     clientEasyTask: easyTask 
     }); 

     user.save(); 

     res.json({ 
     response: { 
      'status': status 
     } 
     }); 
    }); 
    }); 


// Get one user.task 
    app.get('/api/tasks/:id', function (req, res) { 
     return Task.findById(req.params.id, function(err, task) { 

     if(!task) { 
     res.statusCode = 404; 
     return res.send({ error: 'Not found' }); 
     } 

     if(!err) { 
     return res.send({ status: 'OK', task:task }); 
     } else { 

     res.statusCode = 500; 
     console.log('Internal error(%d): %s', res.statusCode, err.message); 
     return res.send({ error: 'Server error' }); 
     } 
    }); 
    }); 
}; 

Я использую почтальон, чтобы проверить все, чтобы не фасад кода. Когда я передаю _id задачи (вложенной в пользователя), я получаю null, когда вызываю Get on '/ api/tasks /: id'. Как я могу получить только конкретную задачу?

В документации по mongoose указано, что вы можете использовать parent.children.id (id); но я не мог заставить его работать.

ответ

1

Поле taskUser содержит задачи как встроенные поддоны, а не ссылки на другую коллекцию, поэтому вы не можете запрашивать задания независимо от пользователей (например, вы пытаетесь сделать).

Для запроса для встроенного subdoc задач, вы можете использовать запрос, как это:

User.findOne({'task._id': req.params.id}) 
    .select('task.$') // Just include the matching task element 
    .exec(function(err, user) { 
    if(!user) { 
     res.statusCode = 404; 
     return res.send({ error: 'Not found' }); 
    } 
    if(!err) { 
     // The matching task will always be in the first element of the task array 
     return res.send({ status: 'OK', task: user.task[0] }); 
    } else { 
     res.statusCode = 500; 
     console.log('Internal error(%d): %s', res.statusCode, err.message); 
     return res.send({ error: 'Server error' }); 
    } 
    } 
); 

Чтобы сделать это эффективно, вы хотите добавить индекс {'task._id': 1}.

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