Mongodb 如何在mongo db中分组和排序
我在mongodb中有一个带有mongoose模式的集合Mongodb 如何在mongo db中分组和排序,mongodb,mongoose,Mongodb,Mongoose,我在mongodb中有一个带有mongoose模式的集合 var collection = new Schema({ name : String, position : Number, category : String }); collection.index({ category : 1, position : 1 }, { unique : true }); 现在我想批量获取记录,以便 应根据类别对所有记录进行分组,然后在每个类别(组)内,应根据位置对所有记录进行排序 比如
var collection = new Schema({
name : String,
position : Number,
category : String
});
collection.index({ category : 1, position : 1 }, { unique : true });
现在我想批量获取记录,以便
应根据类别对所有记录进行分组,然后在每个类别(组)内,应根据位置对所有记录进行排序
比如说
我有以下收藏
[
{ name : 'Mr X', position : 34, category : 'U' },
{ name : 'Mr Y', position : 14, category : 'T' },
{ name : 'Mr G', position : 55, category : 'T' },
{ name : 'Mr I', position : 5, category : 'L' },
{ name : 'Mr D', position : 51, category : 'L' },
{ name : 'Mr P', position : 14, category : 'U' },
{ name : 'Mr P', position : 20, category : 'U' },
{ name : 'Mr E', position : 14, category : 'L' }
]
现在,什么是有效的查询呢
我正在尝试获取第三批(每批2条记录)
我期望的结果是:
[
{ name : 'Mr G', position : 55, category : 'T' },
{ name : 'Mr P', position : 14, category : 'U' }
]
但实际上没有
如果获取所有记录(无任何批次),则预期输出应为
[
{ name : 'Mr I', position : 5, category : 'L' },
{ name : 'Mr E', position : 14, category : 'L' }
{ name : 'Mr D', position : 51, category : 'L' },
{ name : 'Mr Y', position : 14, category : 'T' },
{ name : 'Mr G', position : 55, category : 'T' },
{ name : 'Mr P', position : 14, category : 'U' },
{ name : 'Mr P', position : 20, category : 'U' },
{ name : 'Mr X', position : 34, category : 'U' },
]
编辑:我正在寻找一个查询,可以灵活地适应我不断变化的需求。
如果我想先带T类,然后带L类,然后带U类呢
所以我的预期输出(带限制和跳过)应该是
[
{ name : 'Mr I', position : 5, category : 'L' },
{ name : 'Mr P', position : 14, category : 'U' }
]
据我所知,您根本不想分组,只想按两个字段排序,然后或多或少地进行某种分页。
也就是说,通过下面的聚合管道,我得到了您想要的结果
db.ask.aggregate([
{
$sort : {
category : 1,
position : 1
}
},
{
$project : {
_id : 0,
category : 1,
position : 1,
name : 1
}
},
{
$skip : 4
},
{
$limit : 2
},
])
据我所知,您根本不想分组,只想按两个字段排序,然后或多或少地进行某种分页。
也就是说,通过下面的聚合管道,我得到了您想要的结果
db.ask.aggregate([
{
$sort : {
category : 1,
position : 1
}
},
{
$project : {
_id : 0,
category : 1,
position : 1,
name : 1
}
},
{
$skip : 4
},
{
$limit : 2
},
])
嗯,您需要在复合键上分组以获得所需的结果
db.collection.aggregate([
{$group : { _id : {category:"$category", position:"$position", name:"$name"}}},
{$project:{_id:0, category:"$_id.category", name:"$_id.name", position:"$_id.position"}},
{$sort : {"category" : 1, position:1} },
{$skip : 4 },
{$limit : 2 }
])
这将打印:
{
"category" : "T",
"name" : "Mr G",
"position" : 55.0
}
{
"category" : "U",
"name" : "Mr P",
"position" : 14.0
}
嗯,您需要在复合键上分组以获得所需的结果
db.collection.aggregate([
{$group : { _id : {category:"$category", position:"$position", name:"$name"}}},
{$project:{_id:0, category:"$_id.category", name:"$_id.name", position:"$_id.position"}},
{$sort : {"category" : 1, position:1} },
{$skip : 4 },
{$limit : 2 }
])
这将打印:
{
"category" : "T",
"name" : "Mr G",
"position" : 55.0
}
{
"category" : "U",
"name" : "Mr P",
"position" : 14.0
}
无需分组和其他聚合阶段 只需按正确的字段排序即可 我们可以进行
normal
查询
db.codofoode.find()
.sort({
category : 1,
position : 1
}).skip(4).limit(2)
或聚合
db.codofoode.aggregate([
{
$sort : {
category:1, position : 1
}
},
{
$skip : 4
},
{
$limit : 2
}])
无需分组和其他聚合阶段 只需按正确的字段排序即可 我们可以进行
normal
查询
db.codofoode.find()
.sort({
category : 1,
position : 1
}).skip(4).limit(2)
或聚合
db.codofoode.aggregate([
{
$sort : {
category:1, position : 1
}
},
{
$skip : 4
},
{
$limit : 2
}])
如果要更改类别的顺序,首先是T,然后是L,然后是U,该怎么办??请查看我的编辑如果要更改类别的顺序,首先是T,然后是L,然后是U??请查看我的编辑如果要更改类别的顺序,首先是T,然后是L,然后是U??请看我的编辑Well,继续并尝试一下如果要更改类别的顺序,首先是T,然后是L,然后是U??请看我的编辑Well,继续并尝试一下如果要更改类别的顺序,首先是T,然后是L,然后是U??请参见我的编辑如果您希望结果按升序排列,而我们按升序排列,则结果集将通过要求的测试标准:-)如果要更改类别的顺序,首先是T,然后是L,然后是U,该怎么办??请参阅我的编辑。如果您希望结果按升序排列,我们将按升序排序,则结果集将通过请求的测试标准:-)