在猫鼬中排序和区分
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。
我的猫鼬查询是:
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。