2017-11-25 22 views
2

I持って、次のコレクションこのようなクエリを使用してのMongoDBソート配列

[{ 
    _id: 1 
    "origins": [ 
    { 
     'depth': 100, 
     'magnitudes': [ 
      { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 } 
     ] 
    }, 
    { 
     'depth': 90, 
     'magnitudes': [ 
      { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 } 
     ] 
    } 
    ] 
}, 
{ 
    _id: 2 
    "origins": [ 
    { 
     'depth': 100, 
     'magnitudes': [ 
      { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 } 
     ] 
    }, 
    { 
     'depth': 90, 
     'magnitudes': [ 
      { 'magval': 5 }, { 'magval': 6 }, { 'magval': 7 } 
     ] 
    } 
    ] 
} 

(pymongo):

collection.update(
     {}, 
     { 
      '$push': { 
       'origins': { 
        '$each': [], 
        '$sort': {'depth': -1} 
       } 
      } 
     }, multi=True, upsert=True 
    ) 

...私は場所で私のコレクションを更新することができます原点の埋め込み配列が深さフィールドによって降順にソートされるようにする。

質問は...各原点オブジェクトの子であるマグニチュードオブジェクトの埋め込み配列に対して同様のインプレースソートを実行するにはどうすればよいですか?私は、起源の中のマグニチュードが、魔法によって降順にソートされることを望んでいます。あなたがarray update operators $[ ]を使用できるのMongoDB V3.6では

{ 
    "origins": [ 
    { 
     'depth': 100, 
     'magnitudes': [ 
      { 'magval': 7 }, { 'magval': 6 }, { 'magval': 5 } 
     ] 
    }, 
    { 
     'depth': 90, 
     'magnitudes': [ 
      { 'magval': 7 }, { 'magval': 6 }, { 'magval': 5 } 
     ] 
    } 
    ] 
} 

答えて

0

最終的な出力はそうのようなデータベースに戻って格納する必要があります。この演算子は、更新演算子が指定された配列フィールドのすべての要素を変更する必要があることを示します。

すなわち、あなたの例の文書、使用:

db.collection.update({}, 
        { 
         "$push": { 
           "origins.$[].magnitudes":{ 
                  $each:[], 
                  $sort:{ "magval": -1 } 
                 } 
           } 
        }, 
        {"multi":true, "upsert":true} 
) 

は、あなたのdata modellingアプローチを再検討してくださいと言ったが、配列の配列内に値を格納すると、クエリ/更新が困難になることがあります。