2016-02-17 3 views
0

У меня есть две следующие схемы:Mongoose вложенными заселить

var UserSchema = new mongoose.Schema({ 
    name: { type: String } 
    posts: { 
    owner: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }], 
    contributor: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Post' }] 
    } 
}); 

var PostSchema = new mongoose.Schema({ 
    headline: { type: String, required: true } 
    authors: { 
    owner: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, 
    contributors: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } 
    } 
}); 

В какой-то момент моего заявления мне нужно, чтобы получить информацию о должности для конкретного пользователя. Другими словами, мне нужно получить id и headline должностей, для которых пользователь является владельцем или вкладчиком. Тем не менее, для сообщений, для которых пользователь является автором, мне также необходимо получить информацию об этом авторе (получите id).

Я пытался начать делать что-то вроде этого:

User.findById(req.params.user_id) 
    .populate({ path: 'posts.owner', select: '_id headline' }) 
    .populate({ path: 'posts.contributor', select: '_id headline'}) 
    .exec(function(err, user) { 
     console.log(user); 
    }); 

Но я не уверен в том, как продолжать здесь, или даже если это правильный подход? Можете ли вы дать мне руку помощи?

ответ

0

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

const UserSchema = new mongoose.Schema({ 
    posts: { 
    owner: [{ 
     headline: String, 
     post: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' } 
    }], 
    contributor: [{ 
     headline: String, 
     post: { type: mongoose.Schema.Types.ObjectId, ref: 'Post' } 
    }] 
    } 
}); 

Это создаст некоторую избыточность, однако, это позволит вам не сделать так много запросов всего для получения заголовков сообщений.

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

PostSchema.pre('save', true, function(next, done) { 
    next(); 

    if (!this.isModified('headline')) { 
    return done(); 
    } 

    const User = mongoose.model('User'); 

    return Promise.all([ 
    User.update({'posts.owner': this._id}, {$set: {'posts.owner.$.headline': this.headline}}, {multi: true}).exec(); 
    User.update({'posts.contributors': this._id}, {$set: {'posts.contributors.$.headline': this.headline}}, {multi: true}).exec(); 
    ]) 
    .then(done) 
    .catch(done); 
}); 
+0

Моя проблема не с заголовками Почты ... Моя проблема заключается в том, как я могу получать информацию владельца на должность, в которой некий пользователь является участником! Например, представьте, что я являюсь автором созданного вами сообщения ... Как я могу получить вашу информацию? Поскольку запрос должен быть удален из моего пользовательского объекта, вы получите свою почту и получите сообщение от своей почты! –

0

мне удалось получить информацию, что мне нужно в несколько иной манере, используя async библиотеки.

Вот код:

User.findById(req.params.user_id, function(err, user) { 
    if(err) { throw err; } 

    // if no user is found 
    if(!user) { 
    return res.status(404).send({ message: { user: 'There is no such user.'} }); 
    // something bad happened! The requested user does not exist. 
    } 

    async.parallel({ 
    owner: function(callback) { 
     async.map(user.posts.owner, function(post, callback) { 
     Post.findById(post, 'headline').exec(callback); 
     }, callback); 
    }, 
    contributor: function(callback) { 
     async.map(user.posts.owner, function(post, callback) { 
     Post.findById(post, 'headline authors.owner') 
      .populate({ path: 'authors.owner', select: 'name' }) 
      .exec(callback); 
     }, callback); 
    } 
    }, function(err, results) { 
    if(err) { throw err; } 

    return res.json(results); 
    }); 
}); 
Смежные вопросы