在猫鼬中排序和区分

Sort and distinct in mongoose

我的猫鼬查询是:

Spread.find(findCase).where('loc').near({
        center: {
            type: 'Point',
            coordinates: [self.lon, self.lat]
        },
        maxDistance: distance
}).sort({ts : -1}).distinct("postId").exec();

所以我得到错误:

Error: sort cannot be used with distinct

但是如果我通过控制台传递查询

db.spreads.distinct({}).sort({ts: -1});

没关系。

那么为什么 mongoose 不允许我在一个查询中 select 区分和排序,我该怎么做?

docs 开始,sort 不能与 distinct 一起使用。

Cannot be used with distinct()

但是你可以进行聚合操作:

Spread.aggregate(
{$geoNear:{
  "near":{"type":"Point","coordinates":[self.lon, self.lat]},
  "distanceField":"dist.calculated",
  "maxDistance":distance,
  "query":findcase,
  "spherical": true
}},
{$sort:{"ts":-1}},
{$group:{"_id":"$postId"}},function(err,resp){
  console.log(resp);
  // handle response.
}
)

注意2dsphere 索引需要存在于 loc 字段的集合中。要创建索引,请参考:Does applying a 2dsphere index on a mongoose schema force the location field to be required?.

测试数据:

db.createCollection("test");

db.test.insert({
    loc : {type: 'Point', coordinates : [42,42]},
    ts : new Date(2014,2,5),
    postId : 1
});

db.test.insert({
    loc : {type: 'Point', coordinates : [42,42]},
    ts : new Date(2014,2,5),
    postId : 1
});

db.test.insert({
    loc : {type: 'Point', coordinates : [42,42]},
    ts : new Date(2014,2,4),
    postId : 2
});

db.test.insert({
    loc : {type: 'Point', coordinates : [42,42]},
    ts : new Date(2014,2,3),
    postId : 3
});

有查询

db.test.aggregate([
{
    $geoNear: {
    near : { type: 'Point', coordinates: [ 42, 42 ] },
    distanceField : 'dist.calculated',
    maxDistance: 200,
    spherical: true
    }
},
{
    $sort : {ts: -1}
},
{$group:{"_id":"$postId"}}
]);

给出错误的结果

{ "_id" : 3 }
{ "_id" : 2 }
{ "_id" : 1 }

所以我猜 mongo 首先应用了分组,然后不能按缺失字段排序。出于这个原因,可能 mongoose 禁止在排序时使用 distinct。