Soy bastante nuevo en mangostas, así que probablemente me he perdido algo aquí.

Tengo dos Colecciones "Compañía" y "Usuario". Estoy tratando de obtener todos los Usuarios que pertenecen a una compañía, pero la matriz de usuarios en la compañía está regresando indefinida en lugar de lo que esperaría que fueran los objetos de usuario.

He leído la documentación y completar parece ser un paso en la dirección correcta, sin embargo, no menciona en ningún momento (que pude ver) cómo guardar en una matriz, supongo que necesito enviar los objetos a los correos electrónicos. propiedad en el objeto de usuario?

Vengo de un fondo muy pesado de mysql y tal vez estoy haciendo algo incorrectamente agradecería si alguien pudiera explicar cómo MongoDB maneja las relaciones.

Esquema de la empresa

const companySchema = new Schema({
    name: String,
    slug: String,
    _creator: { type: Schema.Types.ObjectId, ref: 'User' },
    users: [{ type: Schema.Types.ObjectId, ref: 'User' }],
    created_at: Date,
    updated_at: Date
});

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

Esquema de usuario

const userSchema = new Schema({
    first_name: String,
    last_name: String,
    username: String,
    password: String,
    companies: [{ type: Schema.Types.ObjectId, ref: 'Company' }],
    created_at: Date,
    updated_at: Date
});

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

Salvar al usuario

const dave = new User({
    first_name: 'Dave',
    last_name: 'Hewitt',
    username: 'moshie',
    password: '123456789',
    updated_at: new Date()
});

dave.save()
    .then(function (user) {
        const indigoTree = new Company({
            name: 'IndigoTree',
            slug: 'indigotree',
            _creator: dave._id,
            updated_at: new Date()
        });

        indigoTree.users.push(user);

        return indigoTree.save();
    })
    .then(function (company) {
        console.log(company);
    })
    .catch(function (error) {
        console.log(error);
    });

Compruebe el usuario

Company.find({}).populate('users').exec()
   .then(function (doc) {
       doc.users // undefined?
   });

¿Alguna idea?

0
Moshie 15 dic. 2016 a las 15:43

2 respuestas

La mejor respuesta

Estás presionando user en la matriz users. En lugar de eso, necesita push user's Id en la matriz, es decir, user._id.

Reemplazar:

indigoTree.users.push(user);

Con:

indigoTree.users.push(user._id);

Además, la consulta find() devuelve array of documents, por lo que debe usar doc[0].users, no doc.users.

Company.find({}).populate('users').exec()
   .then(function (doc) {
       doc[0].users // undefined? -> change here, it wont come undefined
   });

Como alternativa , puede usar findOne() en lugar de find(), que devuelve un object. En ese caso, puede utilizar doc.users

  Company.findOne({_id: someCompanyId}).populate('users').exec()
   .then(function (doc) {
       doc.users // it wont come undefined
   });
0
Ravi Shankar Bharti 15 dic. 2016 a las 16:57

Según API Docs, Mongoose find() devuelve una colección de matriz en lugar de un solo elemento.

Para findOne () es un documento único potencialmente nulo, busque () una lista de documentos, cuente () el número de documentos, actualice () el número de documentos afectados, etc.

Company.find({}).populate('users').exec().then((doc) => {
    console.log(doc[0].users); // prints users array
});
0
Sridhar 15 dic. 2016 a las 16:50