嵌入文档数组中的Mongodb排序数组

时间:2017-11-25 20:54:57

标签: mongodb sorting

我有以下收藏

[{
  _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
    )

...我可以更新我的集合,以便嵌入的原始数组按深度字段按降序排序。

问题是......如何对作为每个原始对象的子对象的嵌入式数组对象执行类似的就地排序?我希望原点内部的大小按照magval,降序排序。

最终输出应该像这样存储在数据库中:

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

1 个答案:

答案 0 :(得分:0)

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

使用您的示例文档,即:

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

话虽如此,请重新考虑您的data modelling方法;在数组数组中存储值可能会导致查询/更新困难。