2015-06-28 2 views
0

В настоящее время я пытаюсь научиться работать с NoSQL, исходя из фона реляционной базы данных. В этом проекте я использую Express с Mongoose.Mongoose: Слияние двух документов, которые ссылаются друг на друга

Я борюсь с обратными вызовами, когда я пытаюсь объединить две модели вместе, которые ссылаются друг на друга. Я пытаюсь редактировать каждый элемент в группе из одной модели (Ribbits), чтобы содержать атрибуты другого (Пользователи, которые разместили Ribbit). Поскольку вызов для поиска пользователя, связанного с Ribbit, является асинхронным, я не могу вернуть коллекцию отредактированных Ribbits (с информацией о пользователе).

На моем веб-сайте у меня есть ребра (a.k.a. твиты), которые принадлежат пользователям. Пользователи могут иметь множество ребер. На одной из моих страниц я хотел бы перечислить все ребра на службе и некоторую информацию, связанную с пользователем, который разместил этот ребро.

Одно из решений, которое я нашел, было встроенным документом, но я обнаружил, что это в моем случае ограничено показом ребрами, принадлежащими пользователю. В моем случае, я хочу начать сначала с того, чтобы получить все ребра, а затем для каждого ребра прикрепить информацию о том, кто это написал.

В идеале, я бы хотел, чтобы моя функция схемы возвращала массив объектов Ribbit, поэтому я могу сделать это на своем представлении.

// models/user.js 
var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var userSchema = Schema({ 
    username: String, 
    email: String, 
    password: String, 
    name: String, 
    profile: String, 
    ribbits: [{ 
    type: Schema.Types.ObjectId, 
    ref: 'Ribbit', 
    }] 
}); 

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

// models/ribbit.js 
var mongoose = require('mongoose'), 
    Schema = mongoose.Schema, 
    User = require('./user'); 

var ribbitSchema = Schema({ 
    content: { type: String, maxlength: 140 }, 
    created: { type: Date, default: Date.now() }, 
    owner: { type: Schema.Types.ObjectId, ref: 'User' }, 
}); 

ribbitSchema.methods.getOwnerObj = function(cb) { 
    return User.findOne({ _id: this.owner }, cb); 
} 

ribbitSchema.statics.getAllRibbits = function(cb) { 
    this.find({}, function(err, ribbits) { 
    console.log('Before Transform'); 
    console.log(ribbits); 

    ribbits.forEach(function(ribbit) { 
     ribbit.getOwnerObj(function(err, owner) { 
     ribbit = { 
      content: ribbit.content, 
      created: ribbit.created, 
      owner: { 
      username: owner.username, 
      email: owner.email, 
      name: owner.name, 
      profile: owner.profile, 
      } 
     }; 
     }); 
    }); 
    }); 
} 

module.exports = mongoose.model('Ribbit', ribbitSchema); 

ответ

1

Если я правильно понимаю, вы можете использовать Mongoose populate метод для этого сценария:

ribbitSchema.statics.getAllRibbits = function(cb) { 
    this.find({}).populate('owner').exec(function(err, ribbits){ 
    console.log(ribbits[0].owner) 
    return cb(err, ribbits); 
    }) 
}