簡體   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