Mongo:如何按外部重量排序

时间:2014-03-05 08:15:28

标签: mongodb mongoid aggregation-framework

this question之后@NeilLunn优雅地回答,这是我的问题更详细。

这是一组文件,有些没有user_id。 user_id代表创建文档的用户:

{ "user_id" : 11, "content" : "black", "date": somedate }
{ "user_id" : 6, "content" : "blue", "date": somedate }
{ "user_id" : 3, "content" : "red", "date": somedate }
{ "user_id" : 4, "content" : "black", "date": somedate }
{ "user_id" : 4, "content" : "blue", "date": somedate }
{ "user_id" : 90, "content" : "red", "date": somedate }
{ "user_id" : 7, "content" : "orange", "date": somedate }
{ "content" : "orange", "date": somedate }
{ "content" : "red", "date": somedate }
...
{ "user_id" : 4, "content" : "orange", "date": somedate }
{ "user_id" : 1, "content" : "orange", "date": somedate }
{ "content" : "red", "date": somedate }
{ "user_id" : 90, "content" : "purple", "date": somedate }

前端正在拉页面,所以每个页面都有10个项目,我这样做有限制和跳过,它运行得很好。

如果我们有登录用户,我想显示当前登录的用户文档,根据他与之交互的用户,他可能会发现更有趣第一

当前用户可能感兴趣的用户列表按分数排序,位于mongo之外。所以第一个元素是我想要首先显示他的文档的最重要的用户,列表中的最后一个用户是最不重要的。

列表是一个简单的数组,如下所示: [4,7,90,1]。

创建此用户分数的系统不在mongo内,但如果有帮助,我可以复制数据。我也可以更改数组以包含分数。

我想要完成的是以下内容:

从列表中获取按user_id重要性排序的文档,以便user_id 4中的文档将首先显示,user_id中的文档为7秒,依此类推。如果列表中没有用户,我希望显示其余文档。像这样:

  1. 所有带有user_d:4
  2. 的文件
  3. 所有带有user_d:7
  4. 的文件
  5. 所有带有user_d:90
  6. 的文件
  7. 所有带有user_d:1
  8. 的文件
  9. 所有其他文件
  10. 我该如何做到这一点?我从mongo那里问过多吗?

1 个答案:

答案 0 :(得分:6)

鉴于数组[4,7,90,1]您在查询中想要的是:

db.collection.aggregate([
   { "$project": {
       "user_id": 1,
       "content": 1,
       "date": 1,
       "weight": { "$or": [
           { "$eq": ["$user_id": 4] }, 
           { "$eq": ["$user_id": 7] }, 
           { "$eq": ["$user_id": 90] }, 
           { "$eq": ["$user_id": 1] }, 
       ]}
   }},
   { "$sort": { "weight": -1, "date": -1 } }
])

那样做的是,对于$or条件中包含的每个项目,user_id字段都会根据提供的值进行测试,$eq会返回1或{ {1}}或0。{/}。{1}}

您在代码中执行的操作是针对您构建数组条件true的数组中的每个项目。所以它只是为每个equals条件创建一个哈希结构,将它传递给一个数组并将其作为false条件的数组值插入。

我可能应该将$ cond运算符从前面的代码中删除,因此这部分会更清楚。

这里是Ruby Brain的一些代码:

$or

如果你想拥有单独的权重并且我们假设键值对,那么你需要用$ cond嵌套:

$or

请注意,它只是一个返回值,这些不需要按顺序排列。你可以考虑一下那一代。

要生成此结构,请参阅此处:

https://stackoverflow.com/a/22213246/2313887