4

我在 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
4

4 回答 4

6

您可以使用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' }
}
于 2014-02-07T18:31:00.253 回答
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

于 2014-04-23T10:47:54.543 回答
0

可以在序列中使用$unwind> $sort>$group数组专业时,

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

操场

于 2020-08-12T15:44:00.827 回答
-2

您可以使用cursor.sort(sort)

例如:

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

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

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

于 2013-09-25T11:53:32.410 回答