2015-04-21 6 views
4

У меня вопрос с дизайном схемы. У меня есть UserSchema и PostSchema.MongoDB дизайн схемы Mongoose

var User = new Schema({ 
    name: String 
}); 

var Post = new Schema({ 
user: { type: Schema.Types.ObjectId } 
}); 

Кроме того, пользователь может следить за другими пользователями. Сообщение может понравиться другим пользователям. Я хотел бы запросить последователей Пользователя и пользователя ниже, с функциями mongoose, такими как ограничение, пропуск, сортировка и т. Д. Я также хочу запросить сообщение, которое нравится пользователю.

В принципе, моя единственная попытка решить это - сохранить двойную ссылку в каждой схеме. Схемы становятся

var User = new Schema({ 
    name: String, 
    followers: [{ type: Schema.Types.ObjectId, ref: "User" }], 
    following: [{ type: Schema.Types.ObjectId, ref: "User" }] 
}); 

var Post = new Schema({ 
creator: { type: Schema.Types.ObjectId, ref: "User" }, 
userLikes: [{ type: Schema.Types.ObjectId, ref: "User" }] 
}); 

так, код, который будет использоваться для запроса

// Find posts that I create 
Post.find({creator: myId}, function(err, post) { ... }); 

// Find posts that I like 
Post.find({userLikes: myId}, function(err, post) { ... }); 

// Find users that I follow 
User.find({followers: myId}, function(err, user) { ... }); 

// Find users that follow me 
User.find({following: myId}, function(err, user) { ... }); 

Есть ли способ, кроме делать двойную ссылку, как это кажется, что к ошибкам?

ответ

4

Фактически, вам не нужна двойная ссылка. Предположим, вы сохранили ссылку following.

var User = new Schema({ 
    name: String, 
    following: [{ type: Schema.Types.ObjectId, ref: "User" }] 
}); 

Вы можете использовать .populate(), чтобы получить пользователей вы следующие:

EDIT: добавлены опции пропуска/предельными, чтобы показать пример для пагинацией

User.findById(myId).populate({ path:'following', options: { skip: 20, limit: 10 } }).exec(function(err, user) { 
    if (err) { 
    // handle err 
    } 
    if (user) { 
    // user.following[] <-- contains a populated array of users you're following 
    } 
}); 

И, как вы» вы уже упоминали ...

User.find({following: myId}).exec(function(err, users) { ... }); 

... извлекает пользователей, которые следуют за вами.

+0

Да, я могу использовать заполнение. Однако представьте, что у меня много пользователей. Тогда, если я заполню это и отправлю их на передний план, будет много данных. Я больше думаю о том, как реализовать разбиение на страницы/бесконечную прокрутку. –

+0

Вы должны были указать это в своем первоначальном вопросе. Вы не можете ожидать решения, которое соответствует вашим потребностям, если вы не укажете свои потребности. Тем не менее, нет причин, по которым вы не можете реализовать решение для разбивки на страницы/бесконечное прокручивание, используя ответ выше, как точку starti. Однако реализация такого решения выходит за рамки вашего вопроса. – JME

+0

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

Смежные вопросы