mongodb:获取特定文件的最佳方式,然后是其他文件

时间:2014-02-27 19:30:06

标签: ruby-on-rails mongodb mongoid aggregation-framework

假设我有1000个文件,每个文件都有:

user_id
text

现在,我想提取所有这些文档,但首先从一些特定用户(给定一组用户ID)中提取文档,然后是所有其他文档。

如果user_id存在于特定用户数组中(使用范围传递数组)然后对该新属性进行排序,我打算使用map reduce创建一个新的权重内联属性。但是根据我的理解,你不能在map reduce之后排序。

任何人都有一个很好的建议如何解决这个问题?欢迎提出任何建议。

谢谢!

1 个答案:

答案 0 :(得分:4)

这里没有太多细节,但我可以提供一个案例供考虑。考虑以下文档集:

{ "user" : "fred", "color" : "black" }
{ "user" : "bill", "color" : "blue" }
{ "user" : "ted", "color" : "red" }
{ "user" : "ted", "color" : "black" }
{ "user" : "fred", "color" : "blue" }
{ "user" : "bill", "color" : "red" }
{ "user" : "bill", "color" : "orange" }
{ "user" : "fred", "color" : "orange" }
{ "user" : "ted", "color" : "orange" }
{ "user" : "ally", "color" : "orange" }
{ "user" : "alice", "color" : "orange" }
{ "user" : "alice", "color" : "red" }
{ "user" : "bill", "color" : "purple" }

因此,假设您想冒泡用户“bill”和“ted”的项目到结果的顶部,然后其他所有内容按user和{{排序1}}。您可以做的是通过聚合中的$project阶段运行文档,如下所示:

color

那么,根据db.bubble.aggregate([ // Project selects the fields to show, and we add a weight value {$project: { _id: 0, "user": 1, "color": 1, "weight": {$cond:[ {$or: [ {$eq: ["$user","bill"]}, {$eq: ["$user","ted"]} ]}, 1, 0 ]} }}, // Then sort the results with the `weight` first, then `user` and `color` {$sort: { weight: -1, user: 1, color: 1 }} ]) 是否与所需值之一匹配,有条件地为weight分配值。不匹配的文档只会被赋予user值。

当我们将此修改文档移至$sort阶段时,可以使用新的0键对结果进行排序,以便“加权”文档位于顶部,然后还会有其他任何事情发生。

你可以用这种方式对$project一个重量做很多事情。有关更多信息,请参阅运算符参考:

http://docs.mongodb.org/manual/reference/operator/aggregation/