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”的项目冒泡到结果的顶部,然后按user
和color
排序其他所有内容。 您可以做的是通过聚合的$ 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/