猫鼬排序和区别

时间:2015-01-15 17:05:19

标签: node.js mongodb 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不允许我在一个查询中选择distinct和sort,我该怎么办呢?

2 个答案:

答案 0 :(得分:3)

来自docssort不能与distinct一起使用。

  

不能与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?

答案 1 :(得分:0)

测试数据:

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进行排序。