高级查询排序

时间:2014-01-03 21:07:04

标签: mongodb pymongo

我有一个包含以下行的表:

Id1 | Id2 | Id3 | Content

我想通过以下排序查询所有数据:(Id1 + Id2) * 10 + Id3。 使用MySQL我使用join选择此操作并在OrderBy中使用它。如何在mongodb中做同样的事情?

2 个答案:

答案 0 :(得分:3)

您可以使用$project在聚合框架中执行此操作,以“动态”创建新的计算字段,然后$sort按该字段对结果进行排序。

db.collection.aggregate( [ 
     {$project: {Id1:1, Id2:1, Id3:1, Content:1,
                 newField:{$add:[ {$multiply:[ {$add: ["$Id1, "$Id2"]}, 10]}, "$Id3"} } },
     {$sort: {newField:1} }
] );

请注意,由于您无法索引计算值,因此这种排序将在内存中发生,因此如果您的集合非常大,由于您的聚合框架不能使用超过10%的可用RAM的限制,这可能会失败。在$limit之后添加$sort阶段将允许更高效且更少RAM密集的排序。

如果这是您经常进行的一种操作,您可能希望将此计算值存储为文档中的字段(然后您可以对其进行索引并有效地搜索/排序)。如果计算经常发生变化,那么聚合就是最佳选择。

答案 1 :(得分:0)

在mongodb中,sort()操作是不可计算的 - 你只能指定带有表示方向的相关整数的字段(升序或降序)。

http://docs.mongodb.org/manual/reference/method/cursor.sort/

对于您要进行的排序,首先必须计算值(Id1 + Id2) * 10 + Id3并将其存储在集合的单独字段中,然后在find()查询中按该字段排序。这样,如果需要,您还可以在字段上设置索引。