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

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" },
  • subs.time昇順(1)で$ sort
  { $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 に答える