猫鼬追随者/朋友关系查询

时间:2013-12-06 18:21:22

标签: javascript node.js mongodb mongoose

我正在尝试创建一个返回朋友和非朋友的帖子的查询,但确保朋友帖子位于列表顶部。我现在只收到朋友的帖子:

架构

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排序)。

如果我需要重做那些很好的模式和关系。

2 个答案:

答案 0 :(得分:-1)

我要做的就是一起跳过关系模型(如果它不是绝对必要的)并且在用户中有一个朋友字段,而不是:

var User = mongoose.Schema({
    username: String,
    friends: [User],
});

然后你就可以查询朋友的帖子:

Post.find({user: {$in: thisUser.friends}}, function(err, posts) {
    ...
})

使用$ nin代替$ in将其附加到非朋友。

答案 1 :(得分:-2)

老实说,最好的办法是使用友谊对象存储用户名。这些信息极不可能改变。你有多少次在Facebook上改名?