Estoy usando MongoDB como un registro de portero de mi aplicación, a continuación, sincronizar los clientes móviles. Tengo este modelos establecidos en NodeJS:

var UserArticle = new Schema({
    date: { type: Number, default: Math.round((new Date()).getTime() / 1000) }, //Timestamp!
    user: [{type: Schema.ObjectId, ref: "User"}],
    article: [{type: Schema.ObjectId, ref: "Article"}],
    place: Number,    
    read: Number,     
    starred: Number,   
    source: String
});
mongoose.model("UserArticle",UserArticle);

var Log = new Schema({
    user: [{type: Schema.ObjectId, ref: "User"}],
    action: Number, //O => Insert, 1 => Update, 2 => Delete
    uarticle: [{type: Schema.ObjectId, ref: "UserArticle"}],
    timestamp: { type: Number, default: Math.round((new Date()).getTime() / 1000) }
});
mongoose.model("Log",Log);

Cuando quiero obtener el registro puedo usar el siguiente código:


var log = mongoose.model('Log');
log
.where("user", req.session.user)
.desc("timestamp")
.populate("uarticle")
.populate("uarticle.article")
.run(function (err, articles) {
if (err) {
    console.log(err);
        res.send(500);
    return;
}
res.json(articles);

Como se puede ver, quiero mangosta para rellenar el «uarticle» campo de la recopilación de registros y, a continuación, desea rellenar el «artículo» campo de la UserArticle («uarticle»).

Pero, el uso de este código, la Mangosta sólo rellena «uarticle» el uso de la UserArticle Modelo, pero no el artículo de campo en el interior de uarticle.

Es posible lograrlo mediante la Mangosta y rellenar() o debo hacer algo más?

Gracias,

  • Me he topado con el mismo problema en el que la referencia está incrustado en una matriz -> milista: [{ media: {type:Esquema.ObjectId, ‘ref’:’OtherModel’}, meta: [String]}]. Esto produce el siguiente error cuando trato .rellenar(‘milista.mediados de los’)… TypeError: No se puede llamar método de ‘camino’ undefined
InformationsquelleAutor Francesc | 2011-12-17

4 Comentarios

  1. 15

    De lo que yo he comprobado en la documentación y por lo que he oído de usted, esto no se puede conseguir, pero se puede llenar el «uarticle.el artículo» los documentos de sí mismo en la función de devolución de llamada.

    Sin embargo quiero señalar otro aspecto que considero más importante. Dispone de documentos en Una colección de referencia de la colección de B, y en la colección B de documentos tiene otra referencia a los documentos en la colección de C.

    Que están haciendo esta mal (me refiero a la estructura de base de datos), o las que usted debe utilizar una base de datos relacional como MySQL aquí. MongoDB del poder se basa en el hecho de que usted puede incorporar más información en los documentos, por lo que para hacer menor consultas (al tener sus datos en una sola colección). Haciendo referencia a algo que está bien, tener una referencia y, a continuación, otra referencia no parece que usted está tomando la ventaja completa de MongoDB aquí.

    Tal vez le gustaría compartir su situación y la estructura de base de datos para que te pueda ayudar más.

    • Los Registros de la colección es el único que ha raro referencias, yo sólo quería, porque las demás tienen sólo 1 de referencia (para evitar tener que repetir un montón de veces los mismos datos). Creo que para evitar el uso de una gran cantidad de información, no voy a llenar esto de la «uarticle» y el cliente deberá hacer una solicitud para obtener los detalles del Artículo, sólo para mantener las cosas de manera simple y rápida.
    • Puedes dar más detalles de tu respuesta – ¿estoy leyendo bien, que tenga una referencia debe ser examinado. Estoy empezando en mongodb. Después de todo, un montón de tablas relacionales tienen sólo una clave externa. Son documentos incrustados preferible rellenar ObjectId refs?
    • Realmente depende de la estructura del proyecto, a veces puede que incluso desee duplicar datos (embed) para la velocidad, otras veces es probable que necesite para hacer referencia a ella, debido a que los datos serán consulta solo en ciertas condiciones.
  2. 5

    Puede utilizar el mangosta-deep-rellenar plugin para hacer esto. Uso:

    User.find({}, function (err, users) {
       User.deepPopulate(users, 'uarticle.article', function (err, users) {
          //now each user document includes uarticle and each uarticle includes article
       })
    })

    Descargo de responsabilidad: yo soy el autor del plugin.

  3. 2

    Yo enfrentan el mismo problema,pero después de horas de esfuerzos que encontrar la solución.Se puede sin necesidad de utilizar ningún plugin externo:)

        applicantListToExport: function (query, callback) {
          this
           .find(query).select({'advtId': 0})
           .populate({
              path: 'influId',
              model: 'influencer',
              select: { '_id': 1,'user':1},
              populate: {
                path: 'userid',
                model: 'User'
              }
           })
         .populate('campaignId',{'campaignTitle':1})
         .exec(callback);
        }
  4. 0

    ¿algo como:

    populate_deep = function(type, instance, complete, seen)
    {
      if (!seen)
        seen = {};
      if (seen[instance._id])
      {
        complete();
        return;
      }
      seen[instance._id] = true;
      //use meta util to get all "references" from the schema
      var refs = meta.get_references(meta.schema(type));
      if (!refs)
      {
        complete();
        return;
      }
      var opts = [];
      for (var i=0; i<refs.length; i++)
        opts.push({path: refs[i].name, model: refs[i].ref});
      mongoose.model(type).populate(instance, opts, function(err,o){
        utils.forEach(refs, function (ref, next) {
          if (ref.is_array)
            utils.forEach(o[ref.name], function (v, lnext) {
              populate_deep(ref.ref_type, v, lnext, seen);
            }, next);
          else
            populate_deep(ref.ref_type, o[ref.name], next, seen);
        }, complete);
      });
    }

    meta utils es brutal… quieren que el src?

Dejar respuesta

Please enter your comment!
Please enter your name here