2017-08-17 79 views
0

我有聚集的查询,看起来像这样:MongoDB的排序收集通过自定义字段

aggregate.append([ 
      {$sort: paginateOptions.sort}, 
      {$match: paginateOptions.match}, 
      {$skip: (paginateOptions.page - 1) * paginateOptions.limit}, 
      {$limit: paginateOptions.limit}, 
      { 
       $lookup: { 
        from: 'users', 
        localField: 'owner', 
        foreignField: '_id', 
        as: 'owner' 
       } 
      }, 
      { 
       $unwind: { 
        path: '$owner', 
        preserveNullAndEmptyArrays: true 
       } 
      }, 
      { 
       $project: { 
        name: { 
         $concat: ["$firstname", " ", "$lastname"] 
        }, 
        email: 1, 
        owner: { 
         _id: 1, 
         username: 1 
        }, 
        last_note: { 
         $arrayElemAt: ["$notes", -1] 
        } 
       } 
      } 
     ]) 

我想最后一个音符时间字段(last_note.time)进行排序。 问题是,该字段是在项目过程中创建的,如果我将在项目之后添加一个排序,我将只对限制文档进行排序,而不是对整个集合进行排序(因为它将在限制之后并跳过..)

我该怎么办?

回答

0

你应该排序跳过之前与限制:

`[ 
{$match: paginateOptions.match}, 
{$lookup: { 
       from: 'users', 
       localField: 'owner', 
       foreignField: '_id', 
       as: 'owner' 
      } 
     }, 
{$unwind: { 
       path: '$owner', 
       preserveNullAndEmptyArrays: true 
      } 
     }, 
{$project: { 
       name: { 
        $concat: ["$firstname", " ", "$lastname"] 
       }, 
       email: 1, 
       owner: { 
        _id: 1, 
        username: 1 
       }, 
       last_note: { 
        $arrayElemAt: ["$notes", -1] 
       } 
      } 
}, 
{$sort: paginateOptions.sort}, 
{$skip: (paginateOptions.page - 1) * paginateOptions.limit}, 
{$limit: paginateOptions.limit}, 
    ]` 
+0

这种方式查询的性能会很差。从mongodb文档中,排序应该在项目之前,也是跳过和限制 – user3712353