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

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

user_id text 

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

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

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

谢谢!

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

 { "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”的项目冒泡到结果的顶部,然后按usercolor排序其他所有内容。 您可以做的是通过聚合的$ project阶段运行文档,如下所示:

 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 }} ]) 

那么它的作用是根据user是否与所需值之一匹配,有条件地为weight赋值。 不匹配的文档只是给出0值。

当我们将此修改后的文档移至$ sort阶段时,可以使用新的weight键对结果进行排序,以便“加权”文档位于顶部,然后其他任何内容都将跟随。

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

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