2013-09-25 63 views
4

我在mongodb数据库中有如下所示的2个评分集(学生)数据库文档。如何根据子文档对mongodb查询结果进行排序

{ 
    id: 2, 
    type: 'newname', 
    subs: [ 
     { time: 20, val: 'b' }, 
     { time: 12, val: 'a' }, 
     { time: 30, val: 'c' } 
    ] }, { 
    id: 1, 
    type: 'strs', 
    subs: [ 
     { time: 50, val: 'be' }, 
     { time: 1, val: 'ab' }, 
     { time: 20, val: 'cs' } 
    ] } 

如何构建一个查询来获取以下结果

{ 
    id: 1, 
    type: 'strs', 
    subs: [ 
     { time: 1, val: 'ab' }, 
     { time: 20, val: 'cs' }, 
     { time: 50, val: 'be' } 
    ] 
}, 
{ 
    id: 2, 
    type: 'newname', 
    subs: [ 
     { time: 12, val: 'a' }, 
     { time: 20, val: 'b' }, 
     { time: 30, val: 'c' } 
    ] 
} 

即:用于查找基于时间的文件,必须在2个标准

  1. 排序结果查询通过ID ASC
  2. 子文件时间 ASC

回答

0

您可以使用cursor.sort(sort)

对于Exapmle:

db.collection.find().sort({ 'id': 1 }) 

以按升序使用ID对结果进行排序。

欲了解更多详情,请参阅以下链接。 http://docs.mongodb.org/manual/reference/method/cursor.sort/

+0

我怎么它包含我需要根据列表中的内部密钥时间列表进行排序列表项的子文档进行排序。这就是我最需要 –

+0

我认为排序子文件是不可能的http://stackoverflow.com/questions/3848814/sort-sub-documents-in-mongodb –

6

您可以使用cursor.sort()进行排序在同一时间多个字段(基本上是一个组合),但我不认为两个文件,并在同一时间一个子文档字段排序时,它的工作原理。 如果您要在顶端文档的两个不同字段或子文档的两个不同字段上进行排序,那么我猜是没问题的。

因此,您可以使用aggregation框架获得类似的输出。你所要做的就是基本分解subs字段的数组,然后sort它们。

你可以这样做:

db.col.aggregate({$unwind:'subs'}, {$sort:{id:1,'subs.time':1}}); 

与上面的代码,你应该得到类似这样的输出:

{ 
    id: 1, 
    type: 'strs', 
    subs: 
     { time: 1, val: 'ab' } 
},{ 
    id: 1, 
    type: 'strs', 
    subs: 
     { time: 20, val: 'cs' } 
},{ 
    id: 1, 
    type: 'strs', 
    subs: 
     { time: 50, val: 'be' } 
},{ 
    id: 2, 
    type: 'newname', 
    subs: 
     { time: 12, val: 'a' } 
},{ 
    id: 2, 
    type: 'newname', 
    subs: 
     { time: 20, val: 'b' } 
},{ 
    id: 2, 
    type: 'newname', 
    subs: 
     { time: 30, val: 'c' } 
} 
+0

预期的解决方案是{ id:1, type:'的STR, 潜艇: {时间:1,VAL: 'AB'}, {时间:20,VAL: 'CS'}, {时间:50,VAL: '是'} ] }, { ID:2, 类型: 'NEWNAME', 潜艇: {时间:12,VAL: 'A'}, {时间:20,VAL: 'b'}, {时间:30, val:'c'} ] } –

+0

正确,自从我看到这段时间以来已经有一段时间了,但您可以将其作为我编写的聚合的最后一步,并使用$ addToSet获取所需的输出。如果你想,我可以写查询... – tzik

3

奇怪的是,MongoDB中不提供任何方法来通过子文档进行排序查询它。看来你将有更新的子文档的自然排序顺序如下图所示:

如果这些是仅有的2个文档您的收藏中,下面写查询:

db.test.update({}, {$push : {"subs" :{$each : [] , $sort : {time : -1}}}}) 

,然后运行查询根据ID本身排序:

db.test.find().sort({'id':1}).pretty() 

您将得到下面的输出结果。

{                

     "id" : 1,            
     "type" : "strs",          
     "subs" : [            
       {            
         "time" : 50,       
         "val" : "be"       
       },            
       {            
         "time" : 20,       
         "val" : "cs"       
       },            
       {            
         "time" : 1,       
         "val" : "ab"       
       }            
     ]              
}                
{                

     "id" : 2,            
     "type" : "newname",         
     "subs" : [            
       {            
         "time" : 30,       
         "val" : "c"       
       },            
       {            
         "time" : 20,       
         "val" : "b"       
       },            
       {            
         "time" : 12,       
         "val" : "a"       
       }            
     ]              
}  

希望它能解决您的情况。下面是引用:

http://docs.mongodb.org/manual/reference/operator/update/sort/#sort-array-of-documents-by-a-field-in-the-documents

相关问题