我正在尝试创建一个返回朋友和非朋友的帖子的查询,但确保朋友帖子位于列表顶部。我现在只收到朋友的帖子:
架构
var Post = mongoose.Schema({
name: String,
user: { type:ObjectId, ref:'User' },
createdAt: { type:Date, default:Date.now }
});
var User = mongoose.Schema({
username: String
});
var Relationship = mongoose.Schema({
from: { type:ObjectId, ref:'User' },
to: { type:ObjectId, ref:'User' }
});
查询看起来像
Relationship.find({ from : thisUser },function(err,docs){
if (err) {console.log(err);}
var query = Post.find();
var plucked = _.pluck(docs,'to');
query.where('user').in( plucked );
query.sort('-createdAt');
query.limit(20);
query.skip( 20 * page);
query.exec(function(err,posts){
if (err) {console.log(err);}
res.send(posts);
});
});
客户端会在每页上抓20个帖子。所以关于如何返回所有帖子的任何建议,但确保朋友的帖子首先出现?例如,如果有100个符合查询条件的帖子,其中30个来自朋友,则第一页和第二页的一半都将成为朋友帖子(按createdAt排序)。
如果我需要重做那些很好的模式和关系。
答案 0 :(得分:-1)
我要做的就是一起跳过关系模型(如果它不是绝对必要的)并且在用户中有一个朋友字段,而不是:
var User = mongoose.Schema({
username: String,
friends: [User],
});
然后你就可以查询朋友的帖子:
Post.find({user: {$in: thisUser.friends}}, function(err, posts) {
...
})
使用$ nin代替$ in将其附加到非朋友。
答案 1 :(得分:-2)
老实说,最好的办法是使用友谊对象存储用户名。这些信息极不可能改变。你有多少次在Facebook上改名?