繁体   English   中英

如何根据子文档对mongodb查询结果进行排序

[英]How To Sort mongodb query results based on subdocuments

我在 mongodb 数据库中的分数集合(学生)数据库中有 2 个文档,如下所示。

{ 
    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

您可以使用cursor.sort()同时对多个字段(基本上是一个组合cursor.sort()进行排序,但我认为它在同时对文档和子文档字段进行排序时不起作用。 如果您要对顶部文档的两个不同字段或子文档的两个不同字段进行排序,那么我猜就可以了。

因此,您可以使用聚合框架获得类似的输出。 您所要做的基本上就是分解subs字段的数组,然后它们进行排序

你可以这样做:

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' }
}

奇怪的是,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

可以按顺序使用$unwind > $sort > $group special for array,

db.collection.aggregate([
  { $unwind: "$subs" },
  • $sort subs.time升序(1)
  { $sort: { "subs.time": 1 } },
  • $group by id ,并使用$push对象重新构建subs数组,其他字段仍然使用$first
  {
    $group: {
      _id: "$id",
      id: { $first: "$id" },
      type: { $first: "$type" },
      subs: { $push: "$subs" }
    }
  },
  { $project: { _id: 0 } },
  • $sortid升序
  { $sort: { id: 1 } }
])

游乐场

您可以使用cursor.sort(sort)

例如:

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

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

有关更多详细信息,请参阅以下链接。http://docs.mongodb.org/manual/reference/method/cursor.sort/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM