内嵌入文档的数组排序的MongoDB数组

问题描述:

我有以下收集内嵌入文档的数组排序的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 
    ) 

...我可以代替更新我的收藏以便嵌入的原点阵列按深度字段降序排列。

问题是...我如何对每个原点对象的子元素的嵌入数组对象执行类似的就地排序?我希望原始内部的幅度按照魔法降序排列。

最终输出应存放回数据库就像这样:

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

在MongoDB中3.6版,您可以使用array update operators $[ ]。此运算符指示更新运算符应修改指定数组字段中的所有元素。

使用您的示例文件,即:

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

说了这么多,请重新考虑你的data modelling方法;在数组阵列中存储值可能会造成查询/更新困难。