Mongodb 如何在mongo db中分组和排序

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 }); 现在我想批量获取记录,以便 应根据类别对所有记录进行分组,然后在每个类别(组)内,应根据位置对所有记录进行排序 比如

我在mongodb中有一个带有mongoose模式的集合

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,该怎么办??请参阅我的编辑。如果您希望结果按升序排列,我们将按升序排序,则结果集将通过请求的测试标准:-)