Mongoosejs: Populate не возвращает никаких данных

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

Модель компании

'use strict';

/**
 * Module dependencies.
 */
var mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    Agent = mongoose.model('Agent'),
    DBRef = mongoose.SchemaTypes.DBRef;

/**
 * Company Schema
 */
var CompanySchema = new Schema({
name: {
    type: String,
    default: '',
    //required: 'Please fill Company name',
    trim: true
},
created: {
    type: Date,
    default: Date.now
},
updated: {
    type: Date,
    default: Date.now
},
address: {
    type: String,
    default: '',
    //required: 'Please fill Company address',
    trim: true
},
locked: {
    type: Boolean,
    default: true,
},
deleted: {
    type: Boolean,
    default: false,
},
logo: {
    type: String,
    default: '',
},
email: {
    type: String,
    default: '', 
    index: { unique: true }
    //required: 'Please fill Company email',
},
tel: {
    type: String,
    default: '',
    //required: 'Please fill Company tel',
},
fax: {
    type: String,
    default: '',
    //required: 'Please fill Company fax',
},
type: {
    type: String,
    //required: 'Please fill Company type',
    trim: true
},
description: {
    type: String,
    default: '',
    trim: true
},
validator: {
    type: Schema.ObjectId,
    ref: 'User'
},
admins: [Agent]
});

module.exports = mongoose.model('Company', CompanySchema);

Модель агента

'use strict';

/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
//Company = mongoose.model('Company'),
DBRef = mongoose.SchemaTypes.DBRef;

/**
 * Agent Schema
 */
var AgentSchema = new Schema({
// Agent model fields   
// ...
firstname: {
    type: String,
    default: ''
},
lastname: {
    type: String,
    default: ''
},
email: {
    type: String,
    default: '', 
    index: { unique: true }
},
password: {
    type: String,
    default: ''
},
roles: {
    type: Array,
},
created: {
    type: Date,
    default: Date.now
},
updated: {
    type: Date,
    default: Date.now
},
deleted: {
    type: Boolean,
    default: false
},
locked: {
    type: Boolean,
    default: false
},
workFor:  {
    type: Schema.ObjectId,
    ref: 'Company'
}
});

module.exports = mongoose.model('Agent', AgentSchema);

Заполнить код

Company.findById(id).populate('admins').exec(function(err, company) {
    if (err) return next(err);
    if (!company) return next(new Error('Failed to load Company ' + id));
    console.log(company.admins);
    req.company = company ;
    next();
});

Благодарность :) .


person fynx    schedule 13.03.2015    source источник


Ответы (2)


ваше определение схемы компании фактически определяет, что агенты встроены в документ компании, а не упоминаются. Если вам нужны ссылки, которые вы затем могли бы заполнить, вы должны использовать что-то вроде этого:

var CompanySchema = new Schema({
....
admins: [{type: Schema.Types.ObjectId, ref: 'Agent'}],
....
person Reto    schedule 13.03.2015
comment
я так делаю но результата нет - person fynx; 14.03.2015
comment
хорошо, ваша схема и ваш запрос выглядят правильно (если вы внесли исправление, которое я предложил в ответе выше). Может быть, в вашей базе данных нет объектов компании, которые содержат ObjectIds администраторов в коллекции company.admins? Вы проверяли содержимое своей БД перед этим запросом? или покажите нам код, в котором вы сохраняете объекты компании и указанные объекты администратора. - person Reto; 14.03.2015

спасибо рето, вот код сохранения компании:

/**
* Create a Company
 */
exports.create = function(req, res) {
    var company = new Company(req.body);
    User.findById('54e22d19aae0cff01a47df96',function(err,user){
        if (err) {
            return res.status(400).send({
                messages: errorHandler.getErrorMessage(err)
            });
        }


        company.user = user;
        req.checkBody('name', 'please fill the name').notEmpty();
        req.checkBody('address', 'please fill the address').notEmpty();
        req.checkBody('tel', 'please fill a correct phone').notEmpty().isNumeric();
        req.checkBody('type', 'please fill the type').notEmpty();
        req.checkBody('email', 'please fill a correct email').isEmail();
        req.checkBody('admin.firstname', 'please fill the admin firstname').notEmpty();
        req.checkBody('admin.lastname', 'please fill the admin lastname').notEmpty();
        req.checkBody('admin.email', 'please fill a correct admin email').isEmail();
        req.checkBody('admin.password', 'please fill the admin password').notEmpty();

        var errors = req.validationErrors();

        if (errors) {
            return res.status(400).send({
                    messages: errors
                });
        }else{


            company.save(function(err) {
                if (err) {
                    return res.status(400).send({
                        messages: errorHandler.getErrorMessage(err)
                    });
                } else {
                    var agents = preapareAgents(req,company);
                    Agent.create(agents,function(err){
                        if(err){
                            return res.status(400).send({
                                messages: errorHandler.getErrorMessage(err)
                            });
                        }else{
                            res.jsonp({company: company, agents: agents});
                        }
                });

                }
            });

        }
    });


};
person fynx    schedule 15.03.2015
comment
Вы смешиваете две разные концепции: 1. вложенный документ, где администраторы являются частью схемы компании (и сохраняются избыточно в каждой компании) и 2. ссылки, где администраторы сохраняются в другой коллекции, и вы сохраняете только ссылки в компании объекты. Только во втором случае вам нужно заполнить. Ваша исходная схема и ваш код сохранения предполагают концепцию 1, ваш код запроса с заполнением предполагает концепцию 2. Оба варианта хороши, вам просто нужно решить, какой из них использовать. - person Reto; 15.03.2015
comment
На самом деле, я снова посмотрел на ваш код. Я не уверен в ваших намерениях, ваш код сохранения предполагает, что у каждой компании есть 1 агент, но ваша схема имеет массив. Должен ли этот звонок спасти новую компанию И нового агента? Если вам нужны ссылки только в схеме компании, вам нужно сначала сохранить агент, а затем заменить свойство company.agents массивом, содержащим _id уже сохраненного агента, прежде чем сохранять компанию. - person Reto; 15.03.2015
comment
это моя модель: у одной компании есть несколько агентов, и агент связан с одной компанией, как я могу представить это в мангусте, спасибо. NB: я хочу сохранить admin в другой схеме. - person fynx; 16.03.2015
comment
если вы хотите хранить агентов в отдельной схеме, вам нужно сделать это вручную, не ожидайте от мангуста слишком много волшебства. 1. Сохраните агент и получите обратно _id сохраненного агента: new Agent({name: 'bla',}).save(функция обратного вызова) 2. в функции обратного вызова установите идентификатор агента для компании: company.agents = [агент._id]; 3. сохранить компанию, которая теперь содержит ссылку на сохраненного агента: company.save() - person Reto; 16.03.2015
comment
думает @Reto о помощи - person fynx; 18.03.2015
comment
Пожалуйста, рассмотрите возможность принятия / голосования за любой из ответов, если они вам помогают. - person Reto; 18.03.2015