Tengo un primer modelo de Persona:

var personSchema    = new Schema({
    firstname: String,
    name: String
});
module.exports = mongoose.model('Person', personSchema);

Y un segundo modelo de Pareja:

var coupleSchema    = new Schema({
    person1: [{ type: Schema.Types.ObjectId, ref: 'Person' }],
    person2: [{ type: Schema.Types.ObjectId, ref: 'Person' }]
});
module.exports = mongoose.model('Couple', coupleSchema);

Puedo encontrar una pareja con una persona ObjectId:

    Couple.find({
        'person1': req.params.objectid
    })
    .populate({
        path: 'person1 person2'
    })
    .exec(function (err, couple) {
        if (err)
            res.send(err);
        res.json(couple)
    });

Pero me gustaría encontrar una pareja por darle un nombre y no un ObjectId de una Persona, algo así como que:

    Couple.find({
        'person1.firstname': "Bob"
    })
    .populate({
        path: 'person1 person2'
    })
    .exec(function (err, couple) {
        if (err)
            res.send(err);
        res.json(couple)
    });

Pero siempre está vacío…

De todos modos para solucionar esto?

Gracias por cualquier comentario.

EDITAR

He implementado la respuesta:

Vamos a ver a mi Pareja y ahora el modelo:

var Person      = require('mongoose').model('Person');
var coupleSchema    = new Schema({
    person1 : [{ type: Schema.Types.ObjectId, ref: 'Person' }],
    person2 : [{ type: Schema.Types.ObjectId, ref: 'Person' }]
});

coupleSchema.statics.findByUsername = function (username, callback) {
  var query = this.findOne()

  Person.findOne({'firstname': username}, function (error, person) {
    query.where(
      {person1: person._id}
    ).exec(callback);
  })
  return query
}

module.exports = mongoose.model('Couple', coupleSchema);

Con este uso:

Couple.findByUsername(req.params.username, function (err, couple) {
        if(err)
            res.send(err);
        res.json(couple);
    });

Que funciona! Gracias por tu respuesta y ediciones.

InformationsquelleAutor Thomi | 2016-03-24

1 Comentario

  1. 6

    En su couple modelo, person1 es un ObjectID (sé que usted lo sabe), por lo que no tiene, obviamente, ninguna propiedad .firstname.

    Realidad la mejor manera de lograr esto, es encontrar la que el usuario por su nombre y, a continuación, consulta la pareja, con la id del usuario.

    Este método podría/debería estar en la couple modelo como un método estático (simplificado código de ejemplo):

    couple.statics.findByPersonFirstname = function (firstname, callback) {
      var query = this.findOne()
    
      Person.findOne({firstname: firstname}, function (error, person) {
        query.where($or: [
          {person1: person._id},
          {person1: person._id}
        ]).exec(callback);
      })
    
      return query
    }

    Sólo como este ejemplo.

    EDIT: También note que la referencia debe ser el _id (por lo que no podía tienda con el nombre de la primera, que sería una mala idea, de todos modos).

    Teniendo en cuenta su edición:

    Person._id es, quizás, una String y la referencia es un ObjectId, si es así, pruebe:

    {person1: mongoose.Types.ObjectId(Person._id)}

    También, usted variable es person y no Person. Intente iniciar sesión de person a ver si se consigue algo.

    Finalmente, mi ejemplo de código es muy simple, no te olvides de controlar los errores y todos los (ver el enlace que te di arriba, que es completo).

    • Ok me estaba preguntando si hay una forma de deferencia por el ObjectID para obtener la propiedad. Voy a tomar su solución en este caso. Gracias por ayudar!
    • Usted también podría considerar la posibilidad de guardar el primer nombre de la persona en la pareja. O incluso el ahorro de toda la persona, y la eliminación de la ref. En ambos casos se tendría que actualizar a la pareja cuando se actualiza la persona. Esto estaría bien siempre y cuando una persona puede estar en un solo par (como sería sólo duplicado dos veces), y beneficia especialmente si usted también necesita encontrar pareja por personas de nombre, nombre, apellidos, pseudo etc. Y habría de salvar a la populate.
    • No quiero actualizar a la pareja cuando una persona es modificado. Es por eso que yo uso un ref de par.
    • Sí, seguramente, la primera respuesta es probablemente la mejor opción
    • Un último punto antes de validar la respuesta, ¿cómo se puede declarar Persona en la Pareja de la modelo? Porque tengo un problema en coupleSchema.statics.findByPersonFirstname: Person.findOne is not a function
    • Simplemente import o require su Person o modelo
    • Por favor, ver mi edición, todavía se devuelve null
    • Contestado en mi edición

Dejar respuesta

Please enter your comment!
Please enter your name here